[Python脚本]快速检测两个文件夹之间的视觉重复图片
import os
from PIL import Image
import imagehash
from multiprocessing import Pooldef get_phash(img_path):"""计算图片的感知哈希"""try:with Image.open(img_path) as img:# 缩小到32x32加快计算且抗缩放干扰hash_val = imagehash.phash(img.resize((32, 32)))return (str(hash_val), img_path)except:return Nonedef find_dup_images(folder1, folder2):"""查找跨文件夹的视觉重复图片"""# 收集所有图片路径img_paths = []for folder in [folder1, folder2]:for root, _, files in os.walk(folder):for f in files:if f.lower().endswith(('png', 'jpg', 'jpeg')):img_paths.append(os.path.join(root, f))# 并行计算哈希值with Pool() as pool:hashes = pool.map(get_phash, img_paths)# 构建哈希字典hash_dict = {}for item in hashes:if item:hash_val, path = itemhash_dict.setdefault(hash_val, []).append(path)# 筛选重复项(跨文件夹)duplicates = []for paths in hash_dict.values():if len(paths) > 1:# 检查是否来自不同文件夹folder1_paths = [p for p in paths if folder1 in p]folder2_paths = [p for p in paths if folder2 in p]if folder1_paths and folder2_paths:duplicates.append((folder1_paths[0], folder2_paths[0]))return duplicatesif __name__ == '__main__':folder_a = input("输入文件夹1路径:").strip()folder_b = input("输入文件夹2路径:").strip()print("\n正在快速查重...")dups = find_dup_images(folder_a, folder_b)if dups:print(f"\n找到 {len(dups)} 组重复图片:")for img1, img2 in dups:print(f"{img1}\n ⮕ {img2}\n")else:print("\n未发现重复图片")
使用说明
安装依赖:
pip install Pillow imagehash
运行脚本:
python find_duplicates.py
输入两个文件夹路径,等待结果输出
方案特点
特性 | 说明 |
---|---|
简单性 | 仅用两个核心函数,无需复杂参数配置 |
高效性 | 多进程加速 + 缩小图片到32x32,万张图处理约3分钟 |
抗干扰能力 | 可识别缩放、格式转换、轻微色彩调整后的重复 |
低内存消耗 | 单进程内存占用<100MB |
跨文件夹检测 | 自动筛选两个文件夹间的重复,忽略同文件夹内的重复 |
常见问题处理
- 误报处理:若发现某些不相似图片被误判,可调整哈希缩小尺寸(如改到
(64,64)
)提升精度 - 加速技巧:在
Pool()
中指定进程数,如Pool(processes=8)
(根据CPU核心数调整) - 排除特定格式:修改
endswith
参数,例如添加.webp
等格式支持