使用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中的startswith和endswith函数使用实例
Aug 25 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
python中logging包的使用总结
Feb 28 Python
python判断自身是否正在运行的方法
Aug 08 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
Python中使用gflags实例及原理解析
Dec 13 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
matplotlib图例legend语法及设置的方法
Jul 28 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中的一个中文字符串截取函数
2007/02/14 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
php简单生成随机数的方法
2015/07/30 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
JS实现简易计算器
2020/02/14 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
在Python上基于Markov链生成伪随机文本的教程
2015/04/17 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python事件驱动event实现详解
2018/11/21 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
若干个Java基础面试题
2015/05/19 面试题
我的中国梦演讲稿高中篇
2014/08/19 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
市场督导岗位职责
2015/04/10 职场文书
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python