使用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调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Python Socket传输文件示例
Jan 16 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
python在文本开头插入一行的实例
May 02 Python
Python删除n行后的其他行方法
Jan 28 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
Jun 24 Python
Python制作词云图代码实例
Sep 09 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
Python docutils文档编译过程方法解析
Jun 23 Python
Python 实现将某一列设置为str类型
Jul 14 Python
python学习之panda数据分析核心支持库
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 #Python
Python爬虫之爬取最新更新的小说网站
May 06 #Python
Python基础之操作MySQL数据库
Python 如何安装Selenium
Django实现在线无水印抖音视频下载(附源码及地址)
Django给表单添加honeypot验证增加安全性
You might like
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
python开发之thread实现布朗运动的方法
2015/11/11 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
教学实习自我评价
2014/01/28 职场文书
协议书样本
2014/04/23 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
责任书格式
2015/01/29 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
通知怎么写?
2019/04/17 职场文书