使用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 相关文章推荐
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
详解Python多线程
Nov 14 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
pandas-resample按时间聚合实例
Dec 27 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
python def 定义函数,调用函数方式
Jun 02 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
python中加背景音乐如何操作
Jul 19 Python
python中pow函数用法及功能说明
Dec 04 Python
python 下载文件的几种方法汇总
Jan 06 Python
python学习之panda数据分析核心支持库
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 #Python
Python爬虫之爬取最新更新的小说网站
May 06 #Python
Python基础之操作MySQL数据库
Python 如何安装Selenium
Django实现在线无水印抖音视频下载(附源码及地址)
Django给表单添加honeypot验证增加安全性
You might like
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Pyramid添加Middleware的方法实例
2013/11/27 Python
Python常见工厂函数用法示例
2018/03/21 Python
python写日志文件操作类与应用示例
2019/07/01 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
python判断字符串以什么结尾的实例方法
2020/09/18 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
五一服装活动方案
2014/01/11 职场文书
社区庆八一活动方案
2014/02/02 职场文书
代办出身证明书
2014/10/21 职场文书
加班费申请报告
2015/05/15 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书