使用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中的urllib模块使用详解
Jul 07 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
python编写分类决策树的代码
Dec 21 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
python3下pygame如何实现显示中文
Jan 11 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Python数据分析入门之数据读取与存储
May 13 Python
Python Matplotlib库实现画局部图
Nov 17 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 静态变量与自定义常量的使用方法
2010/01/26 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
Python中list初始化方法示例
2016/09/18 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python 中如何获取列表的索引
2019/07/02 Python
python 图片去噪的方法示例
2019/07/09 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
材料化学专业求职信
2014/07/15 职场文书
优秀高中学生评语
2014/12/30 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
主持人大赛开场白
2015/05/29 职场文书
高三数学教学反思
2016/02/18 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android