去除目录下重复图片(去重)

训练集图片有太多重复图片,于是需要去重

import cv2
import os
from collections import defaultdict

def dhash(image, hash_size=8):
    """
    计算图片的差异哈希值
    """
    # 调整图片大小,并多加一列以便计算水平梯度
    resized = cv2.resize(image, (hash_size + 1, hash_size))
    # 计算相邻列像素之间的相对水平梯度
    diff = resized[:, 1:] > resized[:, :-1]
    # 将差异图片转换为哈希值
    return sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v])

def find_duplicates(folder_path):
    """
    找到文件夹中的重复图片
    """
    hashes = defaultdict(list)
    duplicates = []

    # 遍历文件夹中的图片文件
    for filename in os.listdir(folder_path):
        if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
            filepath = os.path.join(folder_path, filename)
            image = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
            if image is None:
                continue
            h = dhash(image)
            hashes[h].append(filepath)

    # 找到哈希值相同的图片
    for h, files in hashes.items():
        if len(files) > 1:
            duplicates.append(files[1:])  # 保留每组重复图片中的第一张,记录其余的图片

    return duplicates

def delete_duplicates(folder_path):
    """
    删除文件夹中的重复图片,只保留每组中的一张
    """
    duplicates = find_duplicates(folder_path)
    for group in duplicates:
        for file in group:
            os.remove(file)
            print(f"已删除重复文件: {file}")

if __name__ == "__main__":
    folder_path = "./data"  # 替换为你的图片文件夹路径,图片名不要带中文
    delete_duplicates(folder_path)
posted @ 2024-05-31 09:46  __username  阅读(18)  评论(0编辑  收藏  举报

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。