检测重复图像
在做一个深度学习的课题,打算做一个自动化采集数据集的自动化设备,运动设备与相机采集曝光频率往往对不上,偶尔会出现卡吨、延迟现象,所以做了一个简易的针对性强的自动筛选的python程序。主要用的式harr感知的手段。常规的哈希感知主要是8x8的图片,但是由于这个样品集本身不同图片之间,样品移动小,8x8的图片较难区分,所以将此改为16x16的图片程序进行哈希感知判断。其中包括程序扩筛选分类移动的程序:
import os
import random
import shutil
import os.path
import math
import cv2
import argparse
import numpy as np
#均值哈希算法
def aHash(img):
#缩放为8*8
num_size=16
img=cv2.resize(img,(num_size,num_size),interpolation=cv2.INTER_CUBIC)
#cv2.imwrite('/home/zc/Desktop/test/1.bmp',img)
#转换为灰度图
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#s为像素和初值为0,hash_str为hash值初值为''
s=0
hash_str=''
#遍历累加求像素和
for i in range(num_size):
for j in range(num_size):
s=s+gray[i,j]
#求平均灰度
avg=s/num_size/num_size
#灰度大于平均值为1相反为0生成图片的hash值
for i in range(num_size):
for j in range(num_size):
if gray[i,j]>avg:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
#差值感知算法
def dHash(img):
#缩放8*8
img=cv2.resize(img,(17,16),interpolation=cv2.INTER_CUBIC)
#转换灰度图
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hash_str=''
#每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(16):
for j in range(16):
if gray[i,j]>gray[i,j+1]:
hash_str=hash_str+'1'
else:
hash_str=hash_str+'0'
return hash_str
#Hash值对比
def cmpHash(hash1,hash2):
n=0
#hash长度不同则返回-1代表传参出错
if len(hash1)!=len(hash2):
return -1
#遍历判断
for i in range(len(hash1)):
#不相等则n计数+1,n最终为相似度
if hash1[i]!=hash2[i]:
n=n+1
return n
return cv2.Laplacian(image, cv2.CV_64F).var()
#主程序
path_name='/home/zc/Desktop/PASSIVE'
image_list = os.listdir(path_name)
image_real_list=[]
image_rep_list=[]
list.sort(image_list)
for i in range(len(image_list)):
if i>=len(image_list): #这是一个防止list溢出的判断函数,因为后面将重复图片都剔除了list。
break
img1=cv2.imread(path_name+'/'+image_list[i])
hash1a= aHash(img1)
# hash1d= dHash(img1)
rep_list=[]
k=0
for n in range(i+1,len(image_list)):
img2=cv2.imread(path_name+'/'+image_list[n])
hash2a= aHash(img2)
na=cmpHash(hash1a,hash2a)
# hash2d= dHash(img2)
#nd=cmpHash(hash1d,hash2d)
if na<22: #这个值根据这个样品的多次尝试来选定的
rep_list.append(image_list[n])
image_rep_list.append(image_list[n])
print(image_list[i]+' and '+image_list[n]+' are simliar, and value is',na)
if k==0:
image_rep_list.append(image_list[i])
k=k+1
#print('break',na,nd)
#break
#print(image_list[i]+' and '+image_list[n]+' value is',na)
if n == len(image_list)-1: #list添加非重复图片
image_real_list.append(image_list[i])
#print(image_list[i]+' and '+image_list[n]+' are not simliar, and value is',na)
# print('done',na)
#print('done',na)
for name_rep in rep_list: #去除重复图片
image_list.remove(name_rep)
#print(name_rep)
# print(image_list[i],1)
for name in image_real_list:
shutil.copy('/home/zc/Desktop/PASSIVE/'+name,'/home/zc/Desktop/PASSIVE_REAL')