图片批量比较工具找出相似

联启 电脑工具 13

本文目录导读:

图片批量比较工具找出相似-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 方案一:Python脚本实现(推荐)
  2. 方案二:使用现成工具
  3. 方案三:在线工具
  4. 使用建议

我来帮你设计一个图片批量比较工具,用于找出相似的图片,以下是几种实现方案:

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

  • 浏览器端运行
  • 简单易用

使用建议

  1. 比较算法选择

    • 感知哈希(pHash):适合内容相似
    • 直方图比较:适合颜色相似
    • 深度学习特征:最准确但较慢
  2. 阈值调整

    • 8-0.9:严格相似(几乎相同)
    • 6-0.8:中等相似
    • 4-0.6:粗略相似
  3. 性能优化

    • 先压缩图片再比较
    • 使用多线程处理
    • 建立图片特征数据库

需要我帮你实现特定功能或调整代码参数吗?

标签: 图片批量比较工具 相似图片查找

抱歉,评论功能暂时关闭!