使用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中cPickle用法例子分享
Jan 03 Python
Python操作列表的常用方法分享
Feb 13 Python
Python中random模块生成随机数详解
Mar 10 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python paramiko模块的使用示例
Apr 11 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
六行python代码的爱心曲线详解
May 17 Python
python内存动态分配过程详解
Jul 15 Python
python zip()函数使用方法解析
Oct 31 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 Python
python学习之panda数据分析核心支持库
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 #Python
Python爬虫之爬取最新更新的小说网站
May 06 #Python
Python基础之操作MySQL数据库
Python 如何安装Selenium
Django实现在线无水印抖音视频下载(附源码及地址)
Django给表单添加honeypot验证增加安全性
You might like
JS实现php的伪分页
2008/05/25 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
如何让页面加载完成后执行js
2013/06/26 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
python计算时间差的方法
2015/05/20 Python
Python实现进程同步和通信的方法
2018/01/02 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Python中求对数方法总结
2020/03/10 Python
Python爬取网页信息的示例
2020/09/24 Python
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
Python中如何定义一个函数
2016/09/06 面试题
国际贸易专业求职信
2014/06/04 职场文书
运动会入场口号
2014/06/07 职场文书
优秀团员自我评价
2015/03/10 职场文书
小学校园广播稿
2015/08/18 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA