版本:
平台: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则为相同(相似?)的图片
1
2
3
4
5
6
7
|
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np
import os,sys,types
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
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)
|
为了节省操作,遍历所有目录,把想要去重的目录遍历一遍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/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对目录下图片进行去重的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/shan_xg/article/details/79448314