使用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中使用poplib模块收取邮件的教程
Apr 29 Python
python爬取51job中hr的邮箱
May 14 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
Python装饰器用法实例总结
May 26 Python
Python删除n行后的其他行方法
Jan 28 Python
python与字符编码问题
May 24 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
AUC计算方法与Python实现代码
Feb 28 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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
用PHP+MySql编写聊天室
2006/10/09 PHP
php self,$this,const,static,-&amp;gt;的使用
2009/10/22 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
Gird事件机制初级读本
2007/03/10 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
详解jQuery中的事件
2016/12/14 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
详解NODEJS的http实现
2018/01/04 NodeJs
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
python中pycurl库的用法实例
2014/09/30 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python使用folium excel绘制point
2019/01/03 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
JAVA中运算符的分类及举例
2015/09/12 面试题
销售员求职个人的自我评价
2014/02/19 职场文书
商场消防安全责任书
2014/07/29 职场文书
谢师宴答谢词
2015/01/05 职场文书
实习介绍信范文
2015/05/05 职场文书
清明节主题班会
2015/08/14 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python