使用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算法学习之计数排序实例
Dec 18 Python
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
Python Socket编程详细介绍
Mar 23 Python
Python正则捕获操作示例
Aug 19 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
Aug 20 Python
python中下标和切片的使用方法解析
Aug 27 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
python中get和post有什么区别
Jun 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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
windows下python安装pip图文教程
2018/05/25 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
python列表返回重复数据的下标
2020/02/10 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
高中英语教学反思
2014/02/04 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
英语导游欢迎词
2015/09/30 职场文书
大学班长竞选稿
2015/11/20 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书