python 批量删除重复图片和其xml文件

Posted stt-ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 批量删除重复图片和其xml文件相关的知识,希望对你有一定的参考价值。

最近有一批数据,大约10000多张图片吧,重复的很多,开始自己写了一个脚本删除重复图片和xml文件

开始之前发现一个同事的遗产里有此类型脚本,决定在此基础上修改,恩,菜鸡的开始之路,果然不能相信另一只菜鸡。

他的脚本就是一个冒泡双重循环下逐像素比较两张图片是否重复,真的慢到反正代码跑了一晚上10000多张图片还没遍历完

行吧,我更强不到那里去了,在他的基础上加了同时删除这张图片对应的xml文件,一张图片比较完就从list中删除,后来经人提醒开始不逐像素比较了

使用md5比较两张图片是否重复,但是这个双重循环遍历,不知道要跑到哪一年(我没有测试像素比较和md5比较哪个更快,反正在图片多的情况下都差不多相当于废物)

后来同事终于搜到网上大神写的脚本,秒秒钟跑完了,我太菜了,大神13年就写了这样的脚本,我果然是个废柴https://blog.csdn.net/frylion/article/details/8505385(大神脚本链接)

其原理是比较图片大小和md5结合来删除重复图片,比较大小已经完胜了我,现在的我才知道size = os.stat(real_path).st_size 这个size不是所谓的1920×1080图片的长宽

在图片比较上也不是那种傻循环,而是利用了字典此工具,大神就是大神啊

我自己的破脚本也粘一下吧,可以结合一下删除同名xml文件

# encoding: utf-8
"""
@author: Shang Tongtong
@contact: tongtong.shang@seetatech.com
@time: 2019/9/4 下午1:34
@file: delete_same_pic_and_xml.py
@desc: 
"""
import os
import cv2
import numpy as np
import hashlib

def get_token(pic):

    m1 = hashlib.md5()
    m1.update(pic)
    token = m1.hexdigest()
    return token

def find_the_same_pic(cwd, xml):
    for path, d, filelist in os.walk(cwd):
        filelist = sorted(filelist)
        filelist = filelist[600:]
        for imgname in filelist:
            if imgname.endswith(jpg):
                oldname1 = os.path.join(path, imgname)
                print(the old pic : , oldname1)
                filelist.remove(imgname)
                img1 = cv2.imread(oldname1)
                #img1 = cv2.resize(img1, (540, 960))
                img1md5 = get_token(img1)
                for imgname1 in filelist:
                    if imgname1.endswith(jpg):
                        oldname2 = os.path.join(path, imgname1)
                        # print(oldname2)
                        img2 = cv2.imread(oldname2)
                        print(oldname2)
                        #img2 = cv2.resize(img2, (540, 960))
                        img2md5 = get_token(img2)
                        # img = img2 - img1
                        # a = max(sum(sum(img)))
                        result = (img1md5 == img2md5)
                        #result = not np.any(difference)

                        if result is True :
                            print(the_same : , oldname1, oldname2)
                            rm_same_pic_and_xml(cwd, imgname1, xml)
                            filelist.remove(imgname1)

                        else:
                            pass
def rm_same_pic_and_xml(cwd, imgname, xml):
    xmlname = imgname.split(.)[0] + .xml

    pic_file = os.path.join(cwd, imgname)
    xml_file = os.path.join(xml, xmlname)
    os.remove(pic_file)
    os.remove(xml_file)

if __name__ == __main__:
    cwd = r/home/stt/data/tinghua/20190903/JPEGImages/

    xml = r/home/stt/data/tinghua/20190903/Annotations/


    find_the_same_pic(cwd, xml)

 

以上是关于python 批量删除重复图片和其xml文件的主要内容,如果未能解决你的问题,请参考以下文章

arcgis如何批量删除重复面?

如何在LINUX服务器上批量删除文件?

Python批量删除mysql中千万级大量数据

怎么批量删除不同文件夹里的png

文件夹里的照片怎么批量删除

批量DOS删除指定文件命令