zoukankan      html  css  js  c++  java
  • 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))
  • 相关阅读:
    springboot @Select @Insert @Update @Delete
    列表全选与全反选
    日期控件处理
    MyCat
    eclipse中copy qualified name使用方式
    JPA
    java数组
    Java多线程
    Hadoop采样器实现全排序(报错java.io.EOFException)
    Hadoop全排序
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/14570074.html
Copyright © 2011-2022 走看看