检测重复图像

检测重复图像

在做一个深度学习的课题,打算做一个自动化采集数据集的自动化设备,运动设备与相机采集曝光频率往往对不上,偶尔会出现卡吨、延迟现象,所以做了一个简易的针对性强的自动筛选的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') 

参考

https://www.jianshu.com/p/f12b545c63a4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值