您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:使用python如何删除同一文件夹下相似的图片

51自学网 2021-10-30 22:41:35
  python
这篇教程使用python如何删除同一文件夹下相似的图片写得很实用,希望能帮到您。

前言

最近整理图片发现,好多图片都非常相似,于是写如下代码去删除,有两种方法:

注:第一种方法只对于连续图片(例一个视频里截下的图片)准确率也较高,其效率高;第二种方法准确率高,但效率低

方法一:相邻两个文件比较相似度,相似就把第二个加到新列表里,然后进行新列表去重,统一删除。

例如:有文件1-10,首先1和2相比较,若相似,则把2加入到新列表里,再接着2和3相比较,若不相似,则继续进行3和4比较…一直比到最后,然后删除新列表里的图片

代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-import osimport cv2from skimage.measure import compare_ssim# import shutil# def yidong(filename1,filename2):#     shutil.move(filename1,filename2)def delete(filename1):    os.remove(filename1)if __name__ == '__main__':    path = r'D:/camera_pic/test/rec_pic'    # save_path_img = r'E:/0115_test/rec_pic'    # os.makedirs(save_path_img, exist_ok=True)    img_path = path    imgs_n = []    num = []    img_files = [os.path.join(rootdir, file) for rootdir, _, files in os.walk(path) for file in files if                 (file.endswith('.jpg'))]    for currIndex, filename in enumerate(img_files):        if not os.path.exists(img_files[currIndex]):            print('not exist', img_files[currIndex])            break        img = cv2.imread(img_files[currIndex])        img1 = cv2.imread(img_files[currIndex + 1])        ssim = compare_ssim(img, img1, multichannel=True)        if ssim > 0.9:            imgs_n.append(img_files[currIndex + 1])            print(img_files[currIndex], img_files[currIndex + 1], ssim)        else:            print('small_ssim',img_files[currIndex], img_files[currIndex + 1], ssim)        currIndex += 1        if currIndex >= len(img_files)-1:            break    for image in imgs_n:        # yidong(image, save_path_img)        delete(image)

方法二:逐个去比较,若相似,则从原来列表删除,添加到新列表里,若不相似,则继续

例如:有文件1-10,首先1和2相比较,若相似,则把2在原列表删除同时加入到新列表里,再接着1和3相比较,若不相似,则继续进行1和4比较…一直比,到最后一个,再继续,正常应该再从2开始比较,但2被删除了,所以从3开始,继续之前的操作,最后把新列表里的删除。

代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-import osimport cv2from skimage.measure import compare_ssimimport shutilimport datetimedef yidong(filename1,filename2):    shutil.move(filename1,filename2)def delete(filename1):    os.remove(filename1)    print('real_time:',now_now-now)if __name__ == '__main__':    path = r'F:/temp/demo'    # save_path_img = r'F:/temp/demo_save'    # os.makedirs(save_path_img, exist_ok=True)    for (root, dirs, files) in os.walk(path):        for dirc in dirs:            if dirc == 'rec_pic':                pic_path = os.path.join(root, dirc)                img_path = pic_path                imgs_n = []                num = []                del_list = []                img_files = [os.path.join(rootdir, file) for rootdir, _, files in os.walk(img_path) for file in files if                             (file.endswith('.jpg'))]                for currIndex, filename in enumerate(img_files):                    if not os.path.exists(img_files[currIndex]):                        print('not exist', img_files[currIndex])                        break                    new_cur = 0                    for i in range(10000000):                        currIndex1 =new_cur                        if currIndex1 >= len(img_files) - currIndex - 1:                            break                        else:                            size = os.path.getsize(img_files[currIndex1 + currIndex + 1])                            if size < 512:                                # delete(img_files[currIndex + 1])                                del_list.append(img_files.pop(currIndex1 + currIndex + 1))                            else:                                img = cv2.imread(img_files[currIndex])                                img = cv2.resize(img, (46, 46), interpolation=cv2.INTER_CUBIC)                                img1 = cv2.imread(img_files[currIndex1 + currIndex + 1])                                img1 = cv2.resize(img1, (46, 46), interpolation=cv2.INTER_CUBIC)                                ssim = compare_ssim(img, img1, multichannel=True)                                if ssim > 0.9:                                    # imgs_n.append(img_files[currIndex + 1])                                    print(img_files[currIndex], img_files[currIndex1 + currIndex + 1], ssim)                                    del_list.append(img_files.pop(currIndex1 + currIndex + 1))                                    new_cur = currIndex1                                else:                                    new_cur = currIndex1 + 1                                    print('small_ssim',img_files[currIndex], img_files[currIndex1 + currIndex + 1], ssim)                for image in del_list:                    # yidong(image, save_path_img)                    delete(image)                    print('delete',image)

总结

到此这篇关于使用python如何删除同一文件夹下相似图片的文章就介绍到这了,更多相关python删除文件夹相似图片内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


python学习之panda数据分析核心支持库
Python列表删除重复元素与图像相似度判断及删除实例代码
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。