使用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 相关文章推荐
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Python错误处理操作示例
Jul 18 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
详解python的四种内置数据结构
Mar 19 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
浅析Python3 pip换源问题
Jan 06 Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 Python
python之语音识别speech模块
Sep 09 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 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
我的论坛源代码(九)
2006/10/09 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python递归实现快速排序
2018/08/18 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
田径运动会通讯稿
2015/07/18 职场文书
Ajax异步刷新功能及简单案例
2021/11/20 Javascript