使用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自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
python+requests接口压力测试500次,查看响应时间的实例
Apr 30 Python
如何用python处理excel表格
Jun 09 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
Django如何创作一个简单的最小程序
May 12 Python
python Django框架快速入门教程(后台管理)
Jul 21 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
2006/12/23 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
js更优雅的兼容
2010/08/12 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
python实现用户登录系统
2016/05/21 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python实现简单的语音识别系统
2017/12/13 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
python交易记录整合交易类详解
2019/07/03 Python
基于python图像处理API的使用示例
2020/04/03 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
一名老师的自我评价
2014/02/07 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
专题组织生活会方案
2014/06/15 职场文书
汽车转让协议书范本
2014/12/07 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
Promise静态四兄弟实现示例详解
2022/07/07 Javascript
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python