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)

 

转载于:https://www.cnblogs.com/stt-ac/p/11514309.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值