使用python opencv对目录下图片进行去重的方法
作者:Sand_Ng 发布时间:2023-07-06 20:04:13
标签:python,opencv,图片,去重
版本:
平台: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
来源:https://blog.csdn.net/shan_xg/article/details/79448314


猜你喜欢
- 从XML中读取数据到内存的实例: public clsSi
- 因为要牵扯到小计,所以需要计算两次。想法:1、把查询到的结果,插入到临时表,2、把统计结果插入到临时表。3、查询临时表记录放置到游标中。4、
- 装饰器作用decorator是当今最流行的设计模式之一,很多使用它的人并不知道它是一种设计模式。这种模式有什么特别之处? 有兴趣可以看看Py
- 概念df.duplicated()使用df.cuplicated()来查看重复数据,返回True,False,数据类型是bool.也可以指定
- 最近在写博客,刚好写到用户注册注销模块,觉得这一方面还是挺有趣的。当尝试掀开 Django 的源代码时一切 API 就不会变得那么摸不着。顺
- 如何在页面中快捷地添加翻页按钮? 先编写一个nextprev.inc文件,再将代码<
- INSERT INTO Table (TestCol) VALUES(‘')其中的TestCol字段,其实在设计的时候,已经被设计为
- 本文实例讲述了python统计文本字符串里单词出现频率的方法。分享给大家供大家参考。具体实现方法如下:# word frequency in
- 前言一个非常神秘的魔术方法。这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述“定律”的唯一例外情况时,我认为值得再
- 使用 NetBox 可以方便的将 asp 应用编译成为独立运行的执行程序,完全摆脱 iis 的束缚,在几乎所有的 Windows
- 1.汇率换算程序案例描述设计一个汇率换算器程序,其功能是将外币换算成人民币,或者相反案例分析分析问题:分析问题的计算部分;确定问题:将问题划
- 基本思路使用GDAL创建Shapefile数据的基本步骤如下:使用osgeo.ogr.Driver的CreateDataSource()方法
- 最近因为想要看漫画,无奈下载的漫画是jpg的格式,网上的转换器还没一个好用的,于是乎就打算用python自己DIY一下:这里主要用了repo
- 前言:一般处理数据使用的是pandas和numpy库,但是填充单元格颜色需要在excel中,使用的是openpyxl库,所以不能直接达到我们
- 1.window.event兼容脚本 2.屏蔽Form提交事件 3.获取事件源 4.添加事件兼容写法 5.Firefox注册innerTex
- 列表与元组列表用大括号[]表示,元组用圆括号()表示。列表可以修改,字符串与元组不可修改。元组的分片还是元组,列表的分片还是列表。1.列表方
- 内容摘要:下面是虚机维护中,经常碰到的一些ASP程序中的数据库调用的错误,现收集整理如下:1.不能打开注册表关键字(8007000e);2.
- 先给大家介绍下Python除法之传统除法、Floor除法及真除法python3.0 /总是执行真除法,不管操作数的类型,都返回浮点数结果(即
- <% dim week_ymd(8) '测出可以手动设定日期,比如this_ymd=#2008-04-1
- MSSQL2005数据库版本 SQL Server 2005 的各版本之间选择 大多数企业都在三个 SQL Ser