OpenCV重复图像检测(用于筛除不同来源下载的重复图像)

最近做深度学习需要从网上批量下载一些图像,遇到一个现实的问题就是不同关键字爬取下来的图像可能完全一样,这样的样本如果不加以清除势必影响模型的学习效果。

写的也比较简单,装有tensorflow的直接可以用,没装的用os实现遍历文件名也可,写的比较仓促就没改,日后有空补上新版

注意:因为这里是用0-255的像素采样(采了10个点)作为信息指纹,所以只能检测出完全一样的图,相似图像或者剪裁过的样本无法检测,网上有一些类似功能的脚本,大家各取所需。

权当练手,不喜勿喷哈哈哈

代码目的:批量检测一个图像库中的所有重复图像并批量归类到垃圾桶

执行所需:自定义图像库路径path和垃圾桶路径trashcan

执行效果:无论重复多少次,path下只保留一张原始图像;trashcan下存放检测到的被重复图像与其所有copy版本(把重复图像也复制到trashcan是为了好比对,也能证明脚本有效)

下面放代码:

import cv2
import os
import tensorflow as tf
import shutil

'''
使用说明:本脚本利用图像中不同灰度像素个数作为信息指纹检测完全相同的图像,用于筛除从网上下载的重复图像
'''

path='./copy-test'    #待检测图像库的路径
trashcan='./trashcan' #删除掉的图像和重复图像本身
img_path_list=[]
img_ID_list=[]

img_list=tf.gfile.ListDirectory(path)
for im_name in img_list:
    im_path=path+'/'+im_name
    img=cv2.imread(im_path)
    img_str=str(img.tolist())
    img_path_list.append(im_path)
    img_ID_list.append(str(img_str.count("25"))+
                                   str(img_str.count("50"))+
                                   str(img_str.count("75"))+
                                   str(img_str.count("100"))+
                                   str(img_str.count("125"))+
                                   str(img_str.count("150")) +
                                   str(img_str.count("175")) +
                                   str(img_str.count("200")) +
                                   str(img_str.count("225")) +
                                   str(img_str.count("250")))
    print('正在生成图像:%s的专属ID'%im_name)

print('全部ID生成完毕,开始检测重复ID,返回索引值')

from collections import defaultdict
non_repeat = defaultdict(list)
repeat = defaultdict(list)
for k, va in [(v,i) for i, v in enumerate(img_ID_list)]:
    print('已将ID号%s下添加新元素%d'%(k,va))
    non_repeat[k].append(va)
    if len(non_repeat[k])>1:
        repeat[k].append(va)
        print('检测到重复图像,索引为%d'%va)
        # os.remove(img_path_list[va])
        shutil.copy(img_path_list[non_repeat[k][0]],trashcan)#把原版也copy一份到trashcan,方便我们对照

        #将重复图像以原图名+当前重复次数命名,方便对照
        new_name=img_path_list[non_repeat[k][0]].split('/')[-1].split('.jpg')[0]+'_copy_'+str(len(non_repeat[k])-1)+'.jpg'
        os.rename(img_path_list[va],path+'/'+new_name)

        shutil.move(path+'/'+new_name, trashcan)#移除重复图像,原文件不再有完全一样的图像
        print('已删除%s' %img_path_list[va])

参考文献:https://www.cnblogs.com/alex-bn-lee/p/10556354.html


版权声明:本文为weixin_41918457原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。