使用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 命令行也可以自动补全
Nov 30 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
Python的Django框架中的表单处理示例
Jul 17 Python
python算法表示概念扫盲教程
Apr 13 Python
简单了解什么是神经网络
Dec 23 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
Python学习开发之图形用户界面详解
Aug 23 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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批量更改数据库表前缀实现方法
2013/10/26 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
2018/08/20 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
jquery动态加载js三种方法实例
2013/08/03 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python读写csv文件方法详细总结
2019/07/05 Python
django实现类似触发器的功能
2019/11/15 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
创联软件面试题笔试题
2012/10/07 面试题
售前工程师职业生涯规划
2014/03/02 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
好媳妇事迹材料
2014/12/24 职场文书
上课说话检讨书
2015/01/27 职场文书
创先争优个人总结
2015/03/04 职场文书
优秀志愿者感言
2015/08/01 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
JavaScript分页组件使用方法详解
2021/07/26 Javascript
PHP遍历数组的6种方式总结
2021/11/17 PHP
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android