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)

 

posted @ 2019-09-12 17:52  pjc的乖宝宝  阅读(1054)  评论(0编辑  收藏  举报