当前位置: 首页 > 图灵资讯 > 行业资讯> Python dHash算法如何使用

Python dHash算法如何使用

来源:图灵python
时间: 2024-07-30 09:54:32

说明

1、缩小图片:缩小到9*8,这样它就有72个像素。

2、转换成灰度图。

3、计算差异值:dhash算法在相邻像素之间工作,因此每行9个像素之间有8个不同的差异,共8行,共64个差异值。

4、获取指纹:如果左像素比右像素亮,则记录为1,否则为0。

5、最后,比较两张图片的指纹,获得汉明距离。

实例

#-*-coding:utf-8-*-
#利用python实现图像识别的多种方法

importcv2
importnumpyasnp
frommatplotlibimportpyplotasplt

#以灰度直方图作为类似比较的最简单实现
defclassify_gray_hist(image1,image2,size=(256,256)):
#先计算直方图
#几个参数必须用方括号包括起来
#这里直接用灰度图计算直方图,所以使用第一个通道,
#通道分离后,还可以获得多个通道的直方图
#bins为16
image1=cv2.resize(image1,size)
image2=cv2.resize(image2,size)
hist1=cv2.calcHist[image1],[0],None,[256][0.0,255.0]
hist2=cv2.calcHist[image2],[0],None,[256],[0.0,255.0])
#直方图可以比较
plt.plot(range(256)hist1,'r')
plt.plot(range(256),hist2,'b')
plt.show()
#计算直方图的重合度
degree=0
foriinrange(len(hist1):
ifhist1[i]!=hist2[i]:
degree=degree+(1-abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree=degree+1
degree=degree/len(hist1)
returndegree

#计算单通道直方图的相似值
defcalculate(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
foriinrange(len(hist1):
ifhist1[i]!=hist2[i]:
degree=degree+(1-abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree=degree+1
degree=degree/len(hist1)
returndegree

#通过获得每个通道的直方图来计算相似度
defclassify_hist_with_split(image1,image2,size=(256,256)):
#将图像resize分离成三个通道,然后计算每个通道的相似值
image1=cv2.resize(image1,size)
image2=cv2.resize(image2,size)
sub_image1=cv2.split(image1)
sub_image2=cv2.split(image2)
sub_data=0
forim1,im2inzip(sub_image1,sub_image2):
sub_data+=calculate(im1,im2)
sub_data=sub_data/3
returnsub_data

#平均哈希算法计算
defclassify_aHash(image1,image2):
image1=cv2.resize(image1,(8,8)
image2=cv2.resize(image2,(8,8))
gray1=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
hash1=getHash(gray1)
hash2=getHash(gray2)
returnHamming_distance(hash1,hash2)

defclassify_pHash(image1,image2):
image1=cv2.resize(image1)
image2=cv2.resize(image2)
gray1=cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
#将灰度图转换为浮点型,然后dct转换
dct1=cv2.dct(np.float32(gray1)
dct2=cv2.dct(np.float32(gray2)
#取左上角的8*8,这些代表图片的最低频率
#该操作等同于c++中使用opencv实现的掩码操作
#在python中进行掩码操作,可以直接取出图像矩阵的某一部分
dct1_roi=dct1[0:8,0:8]
dct2_roi=dct2[0:8,0:8]
hash1=getHash(dct1_roi)
hash2=getHash(dct2_roi)
returnHamming_distance(hash1,hash2)

#输入灰度图,返回hash
defgetHash(image):
avreage=np.mean(image)
hash=[]
foriinrange(image.shape[0]):
forjinrange(image.shape[1]):
ifimage[i,j]>avreage:
hash.append(1)
else:
hash.append(0)
returnhash


#计算汉明距离
defHamming_distance(hash1,hash2):
num=0
forindexinrange(len(hash1):
ifhash1[index]!=hash2[index]:
num+=1
returnnum


if__name__=='__main__':
img1=cv2.imread('10.jpg')
cv2.imshow('img1',img1)
img2=cv2.imread('11.jpg')
cv2.imshow('img2',img2)
degree=classify_gray_hist(img1,img2)
#degree=classify_hist_with_split(img1,img2)
#degree=classify_aHash(img1,img2)
#degree=classify_pHash(img1,img2)
printdegree
cv2.waitKey(0)

以上是Python 使用dHash算法,希望对大家有所帮助。更多Python学习指导:python基础教程

本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。