使用python如何删除同一文件夹下相似的图片


Posted in Python onMay 07, 2021

前言

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

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

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

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

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import cv2
from 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 os
import cv2
from skimage.measure import compare_ssim
import shutil
import datetime
def 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删除文件夹相似图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python访问纯真IP数据库的代码
May 19 Python
Python lambda和Python def区别分析
Nov 30 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
超简单的Python HTTP服务
Jul 22 Python
python的slice notation的特殊用法详解
Dec 27 Python
Python读取YAML文件过程详解
Dec 30 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
python实现简单猜单词游戏
Dec 24 Python
python学习之panda数据分析核心支持库
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 #Python
Python爬虫之爬取最新更新的小说网站
May 06 #Python
Python基础之操作MySQL数据库
Python 如何安装Selenium
Django实现在线无水印抖音视频下载(附源码及地址)
Django给表单添加honeypot验证增加安全性
You might like
从手册去理解分析PHP session机制
2011/07/17 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
php框架知识点的整理和补充
2021/03/01 PHP
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
新年快乐! python实现绚烂的烟花绽放效果
2019/01/30 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
Django实现将views.py中的数据传递到前端html页面,并展示
2020/03/16 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
linux面试题参考答案(5)
2016/11/05 面试题
普通简短的个人自我评价
2014/02/15 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书