使用python opencv对目录下图片进行去重的方法


Posted in Python onJanuary 12, 2019

版本:

平台:ubuntu 14 / I5 / 4G内存

python版本:python2.7

opencv版本:2.13.4

依赖:

如果系统没有python,则需要进行安装

sudo apt-get install python

sudo apt-get install python-dev

sudo apt-get install python-pip

sudo pip install numpy mathplotlib

sudo apt-get install libcv-dev

sudo apt-get install python-opencv

使用感知哈希算法进行图片去重

原理:对每个文件进行遍历所有进行去重,因此图片越多速度越慢,但是可以节省手动操作

感知哈希原理:

1、需要比较的图片都缩放成8*8大小的灰度图

2、获得每个图片每个像素与平均值的比较,得到指纹

3、根据指纹计算汉明距离

5、如果得出的不同的元素小于5则为相同(相似?)的图片

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import cv2
import numpy as np
import os,sys,types
def cmpandremove2(path):
 dirs = os.listdir(path)
 dirs.sort()
 if len(dirs) <= 0:
  return
 dict={}
 for i in dirs:
  prepath = path + "/" + i
  preimg = cv2.imread(prepath)
  if type(preimg) is types.NoneType:
   continue
  preresize = cv2.resize(preimg, (8,8))
  pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
  premean = cv2.mean(pregray)[0]
  prearr = np.array(pregray.data)
  for j in range(0,len(prearr)):
   if prearr[j] >= premean:
    prearr[j] = 1
   else:
    prearr[j] = 0
  print "get", prepath
  dict[i] = prearr
 dictkeys = dict.keys()
 dictkeys.sort()
 index = 0
 while True:
  if index >= len(dictkeys):
   break
  curkey = dictkeys[index]
  dellist=[]
  print curkey
  index2 = index
  while True:
   if index2 >= len(dictkeys):
    break
   j = dictkeys[index2]
   if curkey == j:
    index2 = index2 + 1
    continue
   arr1 = dict[curkey]
   arr2 = dict[j]
   diff = 0
   for k in range(0,len(arr2)):
    if arr1[k] != arr2[k]:
     diff = diff + 1
   if diff <= 5:
    dellist.append(j)
   index2 = index2 + 1
  if len(dellist) > 0:
   for j in dellist:
    file = path + "/" + j
    print "remove", file
    os.remove(file)
    dict.pop(j)
   dictkeys = dict.keys()
   dictkeys.sort()
  index = index + 1
def cmpandremove(path):
 index = 0
 flag = 0
 dirs = os.listdir(path)
 dirs.sort()
 if len(dirs) <= 0:
  return 0
 while True:
  if index >= len(dirs):
   break
  prepath = path + dirs[index]
  print prepath
  index2 = 0
  preimg = cv2.imread(prepath)
  if type(preimg) is types.NoneType:
   index = index + 1
   continue
  preresize = cv2.resize(preimg,(8,8))
  pregray = cv2.cvtColor(preresize, cv2.COLOR_BGR2GRAY)
  premean = cv2.mean(pregray)[0]
  prearr = np.array(pregray.data)
  for i in range(0,len(prearr)):
   if prearr[i] >= premean:
    prearr[i] = 1
   else:
    prearr[i] = 0
  removepath = []
  while True:
   if index2 >= len(dirs):
    break
   if index2 != index:
    curpath = path + dirs[index2]
    #print curpath
    curimg = cv2.imread(curpath)
    if type(curimg) is types.NoneType:
     index2 = index2 + 1
     continue
    curresize = cv2.resize(curimg, (8,8))
    curgray = cv2.cvtColor(curresize, cv2.COLOR_BGR2GRAY)
    curmean = cv2.mean(curgray)[0]
    curarr = np.array(curgray.data)
    for i in range(0,len(curarr)):
     if curarr[i] >= curmean:
      curarr[i] = 1
     else:
      curarr[i] = 0
    diff = 0
    for i in range(0,len(curarr)):
     if curarr[i] != prearr[i] :
      diff = diff + 1
    if diff <= 5:
     print 'the same'
     removepath.append(curpath)
     flag = 1
   index2 = index2 + 1
  index = index + 1
  if len(removepath) > 0:
   for file in removepath:
    print "remove", file
    os.remove(file)
   dirs = os.listdir(path)
   dirs.sort()
   if len(dirs) <= 0:
    return 0
   #index = 0
 return flag
  
def main(argv):
 if len(argv) <= 1:
  print "command error"
  return -1
 if os.path.exists(argv[1]) is False:
  return -1
 path = argv[1]
 '''
 while True:
  if cmpandremove(path) == 0:
   break
 '''
 cmpandremove(path)
 return 0
   
if __name__ == '__main__':
 main(sys.argv)

为了节省操作,遍历所有目录,把想要去重的目录遍历一遍

#!/bin/bash
indir=$1
addcount=0
function intest()
{
 
 for file in $1/*
 do
  echo $file
  if test -d $file 
  then
   ~/similar.py $file/
   intest $file
  fi
 done
}

intest $indir

以上这篇使用python opencv对目录下图片进行去重的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的随机函数小结
Jan 27 Python
Python中property函数用法实例分析
Jun 04 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
python使用tornado实现简单爬虫
Jul 28 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
python中property属性的介绍及其应用详解
Aug 29 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
Python基于百度AI实现抓取表情包
Jun 27 Python
python变量赋值方法(可变与不可变)
Jan 12 #Python
python交换两个变量的值方法
Jan 12 #Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 #Python
浅谈Python中的全局锁(GIL)问题
Jan 11 #Python
Python 实现子类获取父类的类成员方法
Jan 11 #Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 #Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 #Python
You might like
人大复印资料处理程序_输入篇
2006/10/09 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
关于js注册事件的常用方法
2013/04/03 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Python使用gRPC传输协议教程
2018/10/16 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
Python实现自动装机功能案例分析
2020/10/22 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
工作会议通知
2015/04/15 职场文书
体育教师教学随笔
2015/08/15 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android
浅谈Python中的正则表达式
2021/06/28 Python
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python