本文目录导读:

我来帮你设计一个图片批量比较工具,用于找出相似的图片,以下是几种实现方案:
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:粗略相似
-
性能优化:
- 先压缩图片再比较
- 使用多线程处理
- 建立图片特征数据库
需要我帮你实现特定功能或调整代码参数吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播