python 图片去重复 你值得拥有imagededup

现实中我们经常需要用到图像去重,比如为了扩充人脸图像,可以在百度、Google通过关键词下载大量人脸图像,但这些图像可能存在重复,在合并时需要去重。

 

 

 

开源地址:

https://github.com/idealo/imagededup

该库于今年4月份开源,已经有1600+颗星,最近两天还冲上了Github趋势榜。

可以使用 pip 直接安装:

pip install imagededup

 

仅需要 4 行代码即可实现图像去重:

复制代码
from imagededup.methods import PHash
phasher = PHash()

# 生成图像目录中所有图像的二值hash编码
encodings = phasher.encode_images(image_dir='path/to/image/directory')

# 对已编码图像寻找重复图像
duplicates = phasher.find_duplicates(encoding_map=encodings)

# 给定一幅图像,显示与其重复的图像
from imagededup.utils import plot_duplicates
plot_duplicates(image_dir='path/to/image/directory',
                duplicate_map=duplicates,
                filename='ukbench00120.jpg')
复制代码

 

 

 

项目中应用实例

 

复制代码
"""
图片去重
"""
import os
from imagededup.methods import PHash


def process_file(img_path):
    """
    处理图片去重
    :return:
    """
    try:
        phasher = PHash()
        # 生成图像目录中所有图像的二值hash编码
        encodings = phasher.encode_images(image_dir=img_path)
        # print(encodings)
        # 对已编码图像寻找重复图像
        duplicates = phasher.find_duplicates(encoding_map=encodings)
        # print(duplicates)
        only_img = []  # 唯一图片
        like_img = []  # 相似图片

        for img, img_list in duplicates.items():
            if ".png" in img:
                continue
            if img not in only_img and img not in like_img:
                only_img.append(img)
                like_img.extend(img_list)

        # 删除文件
        for like in like_img:
            like_src = os.path.join(img_path, like)
            png_src = like_src[:-4] + ".png"
            if os.path.exists(like_src):
                os.remove(like_src)
            if os.path.exists(png_src):
                os.remove(png_src)

    except Exception as e:
        print(e)


if __name__ == "__main__":
    img_path = "/tmp/t3/"

    num = 0
    for root, dirs, files in os.walk(img_path):
        for dir in dirs:
            file_dir_path = os.path.join(root, dir)
            process_file(file_dir_path)
            num += 1
            print("处理文件夹个数:{}".format(num))
复制代码

 

posted on   星河赵  阅读(3843)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2020-03-23 flask mysql sqlalchemy教程
2018-03-23 Python获取时间范围内日期列表和周列表的函数
2018-03-23 python 集合比较(交集、并集,差集)集合方法大全

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示