圖像對比——相似度對比
三直方圖算法:
import cv2
def calculate(image1, image2):
hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
# 計算直方圖的重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
else:
degree = degree + 1
degree = degree / len(hist1)
return degree
def classify_hist_with_split(image1, image2, size=(256, 256)):
# 將圖像resize后,分離為RGB三個通道,再計算每個通道的相似值
image1 = cv2.resize(image1, size)
image2 = cv2.resize(image2, size)
sub_image1 = cv2.split(image1)
sub_image2 = cv2.split(image2)
sub_data = 0
for im1, im2 in zip(sub_image1, sub_image2):
sub_data += calculate(im1, im2)
sub_data = sub_data / 3
return sub_data
img = cv2.imread('test_1.jpg')
print(classify_hist_with_split(img, img, size=(256, 256)))
均值哈希算法:
import cv2
#均值哈希算法
def aHash(img):
#縮放為8*8
img=cv2.resize(img,(8,8))
#轉換為灰度圖
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#s為像素和初值為0,hash_str為hash值初值為''
s=0
hash_str=''
#遍歷累加求像素和
for i in range(8):
for j in range(8):
s=s+gray[i,j]
#求平均灰度
avg=s/64
#灰度大于平均值為1相反為0生成圖片的hash值
for i in range(8):
for j in range(8):
if gray[i,j]>avg:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
img = cv2.imread('test_1.jpg')
print(aHash(img))
print(len(aHash(img)))
差值哈希算法:
import cv2
def dHash(img):
#縮放8*8
img=cv2.resize(img,(9,8))
#轉換灰度圖
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hash_str=''
#每行前一個像素大于后一個像素為1,相反為0,生成哈希
for i in range(8):
for j in range(8):
if gray[i,j]>gray[i,j+1]:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
img = cv2.imread('test_1.jpg')
print(dHash(img))
print(len(dHash(img)))
感知哈希算法:
import cv2
import numpy as np
def pHash(img):
#縮放32*32
img = cv2.resize(img, (32, 32)) # , interpolation=cv2.INTER_CUBIC
# 轉換為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 將灰度圖轉為浮點型,再進行dct變換
dct = cv2.dct(np.float32(gray))
#opencv實現的掩碼操作
dct_roi = dct[0:8, 0:8]
hash = []
avreage = np.mean(dct_roi)
for i in range(dct_roi.shape[0]):
for j in range(dct_roi.shape[1]):
if dct_roi[i, j] > avreage:
hash.append(1)
else:
hash.append(0)
return hash
img = cv2.imread('test_1.jpg')
print(pHash(img))
直方圖灰度算法:
import cv2
# 計算單通道的直方圖的相似值
def calculate(image1, image2):
hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])
hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])
# 計算直方圖的重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))
else:
degree = degree + 1
degree = degree / len(hist1)
return degree
img = cv2.imread('test_1.jpg')
print(calculate(img,img))

浙公網安備 33010602011771號