如何编程找出视觉一致但属性不同的缺失Canvas Object图片
找出Folder A中Folder B缺失的视觉匹配图片
核心思路
因为两个文件夹的图片视觉一致但文件名、尺寸、画质均不同,无法通过属性比对,只能基于图像视觉内容的特征匹配定位缺失图片。最实用的方案是用感知哈希算法(Perceptual Hash),它能将图片转化为一串短哈希值,视觉相似的图片哈希值差异极小,可忽略尺寸、画质的细微差别。
具体实现步骤(Python示例)
- 安装依赖库:需要
imagehash和Pillow处理图片并计算哈希
pip install imagehash pillow
- 编写脚本实现比对:
import os import imagehash from PIL import Image def get_image_hash(img_path): """计算图片的感知哈希值(dHash)""" try: with Image.open(img_path) as img: # 转灰度图后计算dHash,对位移、尺寸变化鲁棒性更强 return imagehash.dhash(img) except Exception as e: print(f"处理图片失败 {img_path}: {e}") return None def find_missing_image(folder_a, folder_b): # 建立Folder B的哈希集合 b_hashes = set() for filename in os.listdir(folder_b): file_path = os.path.join(folder_b, filename) if os.path.isfile(file_path) and filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')): img_hash = get_image_hash(file_path) if img_hash: b_hashes.add(img_hash) # 遍历Folder A,查找不在B中的图片 missing_images = [] for filename in os.listdir(folder_a): file_path = os.path.join(folder_a, filename) if os.path.isfile(file_path) and filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')): img_hash = get_image_hash(file_path) if img_hash: # 通过汉明距离校验,避免哈希冲突 is_missing = True for b_hash in b_hashes: if img_hash - b_hash < 3: is_missing = False break if is_missing: missing_images.append(file_path) return missing_images # 替换为你的实际文件夹路径 folder_a = "/path/to/Folder A" folder_b = "/path/to/Folder B" missing = find_missing_image(folder_a, folder_b) if missing: print("Folder B缺失的图片:") for img in missing: print(img) else: print("Folder A中没有Folder B缺失的图片")
关键说明
- 哈希算法选择:
dHash(差异哈希)比pHash更适合处理尺寸变化的图片,计算速度也更快。 - 汉明距离阈值:设置为3是因为画质压缩、尺寸缩放可能导致哈希值微小差异,阈值可根据实际情况在1-5之间调整。
- 格式兼容:脚本支持常见图片格式,若有其他格式可自行添加到后缀判断中。
内容的提问来源于stack exchange,提问作者ahmad
相关产品推荐
相关产品推荐

