使用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 相关文章推荐
wxPython框架类和面板类的使用实例
Sep 28 Python
python实现连接mongodb的方法
May 08 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
python的中异常处理机制
Aug 30 Python
Python设计模式之模板方法模式实例详解
Jan 17 Python
python Kmeans算法原理深入解析
Aug 23 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
如何验证python安装成功
Jul 06 Python
使用django自带的user做外键的方法
Nov 30 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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 搜索查询功能实现
2016/11/29 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
Python实现在线程里运行scrapy的方法
2015/04/07 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
html5使用canvas压缩图片的示例代码
2018/09/11 HTML / CSS
医生自荐信
2013/10/11 职场文书
中秋手机店促销方案
2014/06/16 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
焦裕禄观后感
2015/06/03 职场文书
表彰大会新闻稿
2015/07/17 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL