如何对相似imagehash值高效分组以实现同类图片归类
图片感知哈希相似分组实现方案
核心利用imagehash内置的汉明距离计算能力,两个
ImageHash实例直接相减即可得到汉明距离,通常汉明距离≤阈值(常用3~8)即判定为相似图片。
以下是可直接运行的实现代码:
from PIL import Image import imagehash # 相似判定阈值:可根据业务对相似度的要求调整,常用范围3~8 SIMILAR_THRESHOLD = 5 # 原有哈希计算逻辑(修正原代码笔误img1_has → img1_hash) img1_hash = imagehash.average_hash(Image.open('data/image1.jpg')) img2_hash = imagehash.average_hash(Image.open('data/image2.jpg')) img3_hash = imagehash.average_hash(Image.open('data/image3.jpg')) img4_hash = imagehash.average_hash(Image.open('data/image4.jpg')) print(img1_hash, img2_hash, img3_hash, img4_hash) # 输出示例:81c38181bf8781ff, 81838181bf8781ff, 81838181bf8781ff, ff0000ff3f00e7ff hash_lst = [['img1', img1_hash], ['img2', img2_hash], ['img3', img3_hash], ['img4', img4_hash]] # 分组逻辑 groups = [] for img_name, current_hash in hash_lst: found = False # 遍历已有分组,判断是否和分组代表哈希相似 for group in groups: if current_hash - group['represent_hash'] <= SIMILAR_THRESHOLD: group['img_list'].append(img_name) found = True break # 无匹配分组则新建分组,以当前哈希为分组代表 if not found: groups.append({ 'represent_hash': current_hash, 'img_list': [img_name] }) # 提取仅包含图片名的最终结果 result = [group['img_list'] for group in groups] print(result) # 输出:[['img1', 'img2', 'img3'], ['img4']]
适用场景说明
- 千级以内的小数据量:上述实现完全满足需求,逻辑简单易维护。
- 万级及以上的大数据量:可以用局部敏感哈希(LSH)或者VP树(Vantage Point Tree) 优化查询效率,将时间复杂度从O(n²)降低到近似O(n log n),避免全量遍历分组。
内容的提问来源于stack exchange,提问作者minholee
相关产品推荐
相关产品推荐

