使用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的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
浅析python参数的知识点
Dec 10 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
python实现大学人员管理系统
Oct 25 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
Python实现GIF图倒放
Jul 16 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
python中random模块详解
Mar 01 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下escape解码函数的实现方法
2010/08/08 PHP
PHP学习 变量使用总结
2011/03/24 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python3 mmh3安装及使用方法
2019/10/09 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
js实现弹框效果
2021/03/24 Javascript
志愿者活动总结
2014/04/28 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
债务纠纷委托书
2014/08/30 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
党支部鉴定意见
2015/06/02 职场文书
红色电影观后感
2015/06/18 职场文书
新闻稿怎么写
2015/07/18 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers