根据哈希值或者特性值判断图片是否相同

打印 上一主题 下一主题

主题 655|帖子 655|积分 1965

执行图像的批量判重工作时,您可以选用多种方法,具体取决于对"重复"的定义以及您关注的重复范例(是否允许缩放、旋转或轻微的变化)。
方式一:哈希比对
这种方法非常适合寻找几乎相同或者颠末轻微缩放的重复图像。您可以使用像是平均哈希(aHash)、感知哈希(pHash)、差异哈希(dHash)等。
方法二:特性匹配
对于需要在图像中寻找相似部分或者某种程度的图像变化(如旋转、缩放)时,可以接纳特性点提取和匹配方法,例如SIFT、SURF或ORB。然而,这种方法比哈希比对更加复杂和计算麋集,但提供了更高级的图像匹配本领。
代码示例
  1. import os
  2. from PIL import Image
  3. import imagehash
  4. import cv2
  5. class ImageProcess(object):
  6.     def __init__(self, img_path, _type=None):
  7.         """
  8.         初始化函数
  9.         type,1: 平均哈希 aHash, 2: pHash 感知哈希 3:差异哈希 dHash
  10.         img_path: 图片目录
  11.         """
  12.         self._type = _type
  13.         self.img_path = img_path
  14.     def find_duplicates(self):
  15.         """
  16.         哈希对比-对比图片是否相同
  17.         """
  18.         hashes, duplicates = {}, []
  19.         # 遍历图片目录
  20.         image_list = [os.path.join(self.img_path, file_name) for file_name in os.listdir(self.img_path) if
  21.                       file_name.endswith((".png", ".gif", ".jpeg", ".bmp"))]
  22.         for _image in image_list:
  23.             img = Image.open(_image)
  24.             # 计算图像哈希值
  25.             hash_val = imagehash.average_hash(img) if self._type == 1 else imagehash.phash(
  26.                 img) if self._type == 2 else imagehash.dhash(img)
  27.             if hash_val in hashes:
  28.                 duplicates.append((_image, hashes[hash_val]))
  29.             else:
  30.                 hashes[hash_val] = _image
  31.         return duplicates
  32.     @staticmethod
  33.     def match_images(img1, img2):
  34.         """
  35.         匹配图片
  36.         """
  37.         # 初始化orb检测器
  38.         orb = cv2.ORB_create()
  39.         # 提取关键点&描述器
  40.         kp1, de1 = orb.detectAndCompute(img1, None)
  41.         kp2, de2 = orb.detectAndCompute(img2, None)
  42.         # 使用BFMatcher进行匹配
  43.         bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
  44.         matches = bf.match(de1, de2)
  45.         matches = sorted(matches, key=lambda x: x.distance)
  46.         # 依赖于定义的标准,这里只返回匹配特征点的数量
  47.         return len(matches)
  48.     def find_similar_images(self, some_threshold):
  49.         """
  50.         特征匹配-对比图片是否相同
  51.         some_threshold: 相似度阈值
  52.         """
  53.         duplicates = []
  54.         # 加载图片
  55.         image_list = [os.path.join(self.img_path, file_name) for file_name in os.listdir(self.img_path) if
  56.                       file_name.endswith((".png", ".gif", ".jpeg", ".bmp"))]
  57.         images = [(_img, cv2.imread(_img, 0)) for _img in image_list]  # 以灰度模式读取图片
  58.         # 图片两两对比
  59.         for i in range(len(images)):
  60.             for j in range(i + 1, len(images)):
  61.                 img1_name, img1 = images[i]
  62.                 img2_name, img2 = images[j]
  63.                 matches = self.match_images(img1, img2)
  64.                 # 假如匹配点超过阈值,则认为图片相似
  65.                 if matches > some_threshold:
  66.                     duplicates.append((img1_name, img2_name, matches))
  67.         return duplicates
  68. if __name__ == '__main__':
  69.     img_type = 3
  70.     _path = "XXX"
  71.     img_obj = ImageProcess(_path)
  72.     print(img_obj.find_similar_images(400))
复制代码
备注:
1: orb.detectAndCompute 是一种特性检测和描述符计算方法,通常用于图像处理和计算机视觉中。ORB(Oriented FAST and Rotated BRIEF)是一种结合了 FAST 特性检测器和 BRIEF 描述符的方法,它具有旋转不变性和尺度不变性。detectAndCompute 方法结合了特性检测和描述符计算两个步骤,可以在图像中检测出特性点并计算这些特性点的描述符。
具体来说,orb.detectAndCompute(image, mask) 的作用如下:
image 是输入的图像,用于举行特性检测和描述符计算。
mask 是可选参数,用于指定感爱好区域(ROI),只在这个区域内举行特性检测和描述符计算。
在使用 orb.detectAndCompute 方法时,通常需要先创建一个 ORB 对象,然后调用 detectAndCompute 方法来检测特性点并计算描述符。这个方法常用于图像特性匹配、目标检测、图像拼接等应用中。
2: cv2.ORB_create() 是 OpenCV 中用于创建 ORB 特性检测器对象的函数。ORB(Oriented FAST and Rotated BRIEF)是一种结合了 FAST 特性检测器和 BRIEF 描述符的特性提取算法,具有旋转不变性和尺度不变性,适用于图像特性匹配、目标检测等任务。
  1. import cv2
  2. # 创建 ORB 特征检测器对象
  3. orb = cv2.ORB_create()
  4. # 读取输入图像
  5. image = cv2.imread('image.jpg')
  6. # 将图像转换为灰度图
  7. gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  8. # 使用 ORB 对象检测特征点并计算描述符
  9. keypoints, descriptors = orb.detectAndCompute(gray_image, None)
  10. # 绘制特征点
  11. image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
  12. # 显示图像
  13. cv2.imshow('Image with keypoints', image_with_keypoints)
  14. cv2.waitKey(0)
  15. cv2.destroyAllWindows()
复制代码
在上面的示例中,首先使用 cv2.ORB_create() 创建了一个 ORB 特性检测器对象,然后读取输入图像并将其转换为灰度图像。接着使用 ORB 对象的 detectAndCompute() 方法检测图像中的特性点并计算描述符,最后将特性点绘制在图像上并显示出来。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表