使用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运行时间的几种方法
Jun 17 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
pandas去除重复列的实现方法
Jan 29 Python
对Python3使运行暂停的方法详解
Feb 18 Python
django中SMTP发送邮件配置详解
Jul 19 Python
pytorch动态网络以及权重共享实例
Jan 06 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Python实现的中国剩余定理算法示例
2017/08/05 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
Python 运行 shell 获取输出结果的实例
2019/01/07 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
俞敏洪北大演讲稿
2014/05/22 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
环卫工人节活动总结
2014/08/29 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技