我使用感知哈希算法对多张图片进行了测试,以上链接中提到差值哈希的速度更快、准确度更高,因此直接用的差值哈希(dhash),但是并未有很好的效果。感知哈希对图片进行缩放,提取特征,不考虑过多的局部特征,可能这也是它不够准确的原因吧。考虑寻找其他方法。
我尝试将汉明距离为6及以下的认为是相似图片,相似的图片基本上能找到,但是还有一些不同的图片也会被认为相似,设置汉明距离为5时,相似的图片也不再能找到。
贴出代码,代码参考上述链接。
import os
import numpy as np
import cv2
class XHash:
'''
感知 Hash 算法
'''
def __init__(self, image_path, hash_type):
self.image_path = image_path
self.hash_size = 8
self.type = hash_type
if self.type == 'aHash':
self.hash = self.__aHash()
elif self.type == 'dHash':
self.hash = self.__dHash()
def __get_gray(self, img):
'''
读取 RGB 图片 并转换为灰度图
'''
# 由于 cv2.imread 无法识别中文路径,所以使用 plt.imread
return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图
def __difference(self):
'''
比较左右像素的差异
'''
#img = plt.imread(self.image_path)
img = cv2.imdecode(np.fromfile(self.image_path,dtype=np.uint8),cv2.IMREAD_COLOR) # 解决无法取得中文路径问题
resize_img = cv2.resize(img, (self.hash_size+1, self.hash_size)