当前位置: 首页 > 后端技术 > Python

Python识别图像相似度

时间:2023-03-26 01:30:51 Python

importcv2importnumpyasnp#AverageHashAlgorithmdefaHash(img):#Scaleto8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#转换灰度图像gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素点,初值为0,hash_str为散列值初值为''s=0hash_str=''#遍历累加求像素和为iinrange(8):forjinrange(8):s=s+gray[i,j]#求平均灰度avg=s/64#灰度大于1的平均值,反之为0生成图片的hash值foriinrange(8):forjinrange(8):ifgray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'returnhash_str#差异感知算法defdHash(img):#Scale8*8img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)#转换灰度图像gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str=''#每行第一个像素大于最后一个像素,which为1,相反为0,生成hashforiinrange(8):forjinrange(8):ifgray[i,j]>gray[i,j+1]:hash_str=hash_str+'1'其他:hash_str=hash_str+'0'returnhash_str#Hash值比较defcmpHash(hash1,hash2):n=0#如果hash长度不同,返回-1表示参数错误iflen(hash1)!=len(hash2):return-1#遍历判断foriinrange(len(hash1)):#如果不相等,n算+1,n最终就是相似度ifhash1[i]!=hash2[i]:n=n+1returnn#取每一个第二秒比较mp4的截图#图片1img1=cv2.imread(r'a.jpg')#图片2img2=cv2.imread(r'b.jpg')hash1=aHash(img1)hash2=aHash(img2)print(hash1)print(hash2)n=cmpHash(hash1,hash2)print('平均哈希算法相似度:'+str(n))hash1=dHash(img1)hash2=dHash(img2)print(hash1)print(hash2)n=cmpHash(hash1,hash2)print('差异哈希算法相似度:'+str(n))#差异越小,均值哈希算法越相似&&差异哈希算法差异(otherAttachedperceptualhash:averagehash(aHash):imagescaling,一般为88,或者3232;图像灰度;平均值,根据平均值(大于平均值1小于平均值0)对每个像素进行二值化;转换8*8=64位,每8位是一个十六进制值,转换成字符串,生成哈希值(指纹);感知哈希(pHash):图像缩放,一般为32*32;图像灰度;对图像进行离散余弦变换(DCT),进行频域转换;频域左上角取8*8大小(图像的能量集中在低频部分,低频位于左上角);averagevalue,根据平均值(大于平均值1小于平均值0)对每个像素进行二值化;生成哈希值;差异哈希(dHash):将图像缩放为9*8的大小;图像是灰度的;差值计算(每行相邻像素点的差值,会产生8*8的差值,如果前一个像素点大于下一个像素点则为1,否则为0);生成哈希值;

猜你喜欢