本文目录导读:

我来帮你设计一个图片批量比较工具,用于找出相似的图片,以下是几种实现方案:
Python脚本实现(推荐)
import os
import cv2
import numpy as np
from PIL import Image
import imagehash
from sklearn.metrics.pairwise import cosine_similarity
from tqdm import tqdm
import shutil
class ImageSimilarityFinder:
def __init__(self, similarity_threshold=0.8):
self.threshold = similarity_threshold
self.image_hashes = {}
self.image_features = {}
def extract_features(self, image_path):
"""提取图像特征(使用预训练模型)"""
try:
img = cv2.imread(image_path)
if img is None:
return None
# 调整大小以统一特征
img_resized = cv2.resize(img, (224, 224))
# 计算颜色直方图特征
hist = cv2.calcHist([img_resized], [0, 1, 2], None, [8, 8, 8],
[0, 256, 0, 256, 0, 256])
hist = cv2.normalize(hist, hist).flatten()
return hist
except Exception as e:
print(f"处理图片 {image_path} 时出错: {e}")
return None
def compute_phash(self, image_path):
"""计算感知哈希"""
try:
with Image.open(image_path) as img:
# 转换为灰度图并调整大小
img = img.convert('L').resize((8, 8), Image.LANCZOS)
return imagehash.phash(img)
except:
return None
def find_similar_images(self, image_directory):
"""批量查找相似图片"""
# 支持的文件格式
image_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff'}
# 收集所有图片
images = []
for root, dirs, files in os.walk(image_directory):
for file in files:
if any(file.lower().endswith(ext) for ext in image_extensions):
images.append(os.path.join(root, file))
print(f"找到 {len(images)} 张图片")
# 计算所有图片的特征
all_features = {}
for img_path in tqdm(images, desc="正在提取特征"):
features = self.extract_features(img_path)
if features is not None:
all_features[img_path] = features
# 查找相似图片
similar_groups = []
processed = set()
for i, (path1, features1) in enumerate(tqdm(all_features.items(), desc="正在比较")):
if path1 in processed:
continue
similar_group = [path1]
processed.add(path1)
for path2, features2 in all_features.items():
if path2 in processed:
continue
# 计算余弦相似度
similarity = cosine_similarity([features1], [features2])[0][0]
if similarity > self.threshold:
similar_group.append(path2)
processed.add(path2)
if len(similar_group) > 1:
similar_groups.append(similar_group)
return similar_groups
def organize_similar_images(self, image_directory, output_directory):
"""将相似图片分类到不同文件夹"""
similar_groups = self.find_similar_images(image_directory)
if not os.path.exists(output_directory):
os.makedirs(output_directory)
for i, group in enumerate(similar_groups):
group_dir = os.path.join(output_directory, f"similar_group_{i+1}")
os.makedirs(group_dir, exist_ok=True)
for img_path in group:
try:
shutil.copy2(img_path, group_dir)
except:
print(f"复制文件失败: {img_path}")
print(f"找到 {len(similar_groups)} 组相似图片")
return similar_groups
# 使用示例
if __name__ == "__main__":
finder = ImageSimilarityFinder(similarity_threshold=0.85)
# 查找相似图片
input_directory = "./images" # 修改为你的图片目录
output_directory = "./similar_images" # 输出目录
similar_images = finder.find_similar_images(input_directory)
# 输出结果
if similar_images:
print("\n发现相似图片组:")
for i, group in enumerate(similar_images, 1):
print(f"\n组 {i}:")
for img_path in group:
print(f" - {img_path}")
# 组织到文件夹
finder.organize_similar_images(input_directory, output_directory)
else:
print("未找到相似图片")
使用现成工具
DupeGuru (推荐)
- 支持图片相似度比较
- 跨平台(Windows/Mac/Linux)
- 使用感知哈希算法
Visipics
- 专门用于查找相似图片
- 支持多种相似度等级
- 免费且轻量级
ImageDupeless
- 高效的图片查重工具
- 支持大容量图片库
- 可自定义比较阈值
在线工具
ImgClip
- 在线批量比较
- 支持多种图片格式
- 无需安装
Similar Images Finder
- 浏览器端运行
- 简单易用
使用建议
-
比较算法选择:
- 感知哈希(pHash):适合内容相似
- 直方图比较:适合颜色相似
- 深度学习特征:最准确但较慢
-
阈值调整:
- 8-0.9:严格相似(几乎相同)
- 6-0.8:中等相似
- 4-0.6:粗略相似
-
性能优化:
- 先压缩图片再比较
- 使用多线程处理
- 建立图片特征数据库
需要我帮你实现特定功能或调整代码参数吗?
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。