项目位置:OpenCV-Sample
代码位置:42-Hashcompare.py
关于Hash值计算图片相似度的研究我感觉到头了,我对他的调查还有这篇:
《Python imagehash中的均值哈希、感知哈希、梯度哈希、小波哈希对比图片相似度》
免责声明
这是两个不靠谱的对比方式,不靠谱为啥还写出来呢?我看有人用这个方式我就来调查一下,发现不靠谱所以展示给大家,避免一起浪费时间。
先看测完图片吧,效果很差,类似卷积操作或者pool操作。
![]() | ![]() | ![]() | ![]() | ![]() |
Hash均值对比:
1.第一步对灰度图进行reset操作,我这里设置的8x8,获得了8x8的矩阵。
2.求8x8的均值。
3.操作矩阵,大于均值的设置成为1,小于均值的设置成为0。
4.通过上一步的值1,、值0操作,获取了图像特质的Hash值。
5.求相同位置为1的个数的。
Hash差值对比:
1.第一步对灰度图进行reset操作,我这里设置的8x8,获得了8x8的矩阵。
2.将8x8的矩阵进行拉直处理。
3.对一维矩阵进行差值比较,如果自身大于后一个,值1,否则值0 例如:【10, 20, 5, 100】转换过完为【0, 1, 0, 1】,最后一个为没得比较直接设置成了1。
4.求相同位置为1的个数的。
代码如下:
import cv2 as cv
import numpy as np
fileList = ['./res/hashsame.jpeg', './res/hashsame1.jpeg', './res/hashsame2.jpeg', './res/hashsame3.jpeg',
'./res/face.jpeg']
def hashAVGComp(imgList):
hashList = []
for img in imgList:
avg = np.mean(img)
#小于均值的值0
img[img <= avg] = 0
#大于均值的值1
img[img > avg] = 1
hashList.append(img.flatten())
for i in range(len(hashList)):
for j in range(i + 1, len(hashList)):
# 这里的与运算就是查找相同位置为1的,sum统计总共有几个。
print(np.sum(hashList[i] & hashList[j]), fileList[i], fileList[j])
def hashSubComp(imgList):
hashList = []
for img in imgList:
fla = img.flatten()
# 这里比较奇妙,也没理由,如果自身大于后一个,值1,否则值0 例如:【10, 20, 5, 100】转换过完为【0, 1, 0, 1】,最后一个为没得比较直接设置成了1。
for i in range(len(fla) - 1):
if fla[i] <= fla[i+1]:
fla[i] = 0
else:
fla[i] = 1
fla[i+1] = 0
hashList.append(fla)
for i in range(len(hashList)):
for j in range(i + 1, len(hashList)):
print(np.sum(hashList[i] & hashList[j]), fileList[i], fileList[j])
def main():
imgList = []
for f in fileList:
#图片以灰度单通道的方式加载
img = cv.imread(f, 0)
imgList.append(cv.resize(img, (8, 8), cv.INTER_CUBIC))
hashSubComp(imgList)
print('****************')
hashAVGComp(imgList)
if __name__ == "__main__":
main()
本文探讨了使用OpenCV进行图片相似度检测的两种Hash值对比方法:Hash均值对比和Hash差值对比。作者指出这两种方法效果不佳,并提供了详细的操作步骤,以示例代码展示其工作原理,旨在避免读者走弯路。





391

被折叠的 条评论
为什么被折叠?



