使用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获取文件版本信息、公司名和产品名的方法
Oct 05 Python
Python进阶-函数默认参数(详解)
May 18 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python验证码识别教程之滑动验证码
Jun 04 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
利用Django-environ如何区分不同环境
Aug 26 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python StringIO如何在内存中读写str
Jan 07 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
pycharm 复制代码出现空格的解决方式
Jan 15 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
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
网友原创的PHP模板类代码
2008/09/07 PHP
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
php检测useragent版本示例
2014/03/24 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php简单分页类实现方法
2015/02/26 PHP
javascript 操作文件 实现方法小结
2009/07/02 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
利用python 读写csv文件
2020/09/10 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
Linux文件系统类型
2012/02/15 面试题
秋季运动会表扬稿
2014/01/16 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
农村门前三包责任书
2014/07/25 职场文书
2014年学校工作总结
2014/11/20 职场文书
2014年工程工作总结
2014/11/25 职场文书
班主任寄语2015
2015/02/26 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技