图像处理:利用相似度处理相似度较大的图像
import sys
import os
import cv2
def aHash(img):
# 均值哈希算法
# 缩放为8*8
img = cv2.resize(img, (8, 8))
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# s为像素和初值为0,hash_str为hash值初值为''
s = 0
hash_str = ''
# 遍历累加求像素和
for i in range(8):
for j in range(8):
s = s + gray[i, j]
# 求平均灰度
avg = s / 64
# 灰度大于平均值为1相反为0生成图片的hash值
for i in range(8):
for j in range(8):
if gray[i, j] > avg:
hash_str = hash_str + '1'
else:
hash_str = hash_str + '0'
return hash_str
def cmpHash(hash1, hash2):
# Hash值对比
# 算法中1和0顺序组合起来的即是图片的指纹hash。顺序不固定,但是比较的时候必须是相同的顺序。
# 对比两幅图的指纹,计算汉明距离,即两个64位的hash值有多少是不一样的,不同的位数越小,图片越相似
# 汉明距离:一组二进制数据变成另一组数据所需要的步骤,可以衡量两图的差异,汉明距离越小,则相似度越高。汉明距离为0,即两张图片完全一样
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
def runAllImageSimilaryFun(para1, para2):
# 均值、差值、感知哈希算法三种算法值越小,则越相似,相同图片值为0
# 三直方图算法和单通道的直方图 0-1之间,值越大,越相似。 相同图片为1
# t1,t2 14;19;10; 0.70;0.75
# t1,t3 39 33 18 0.58 0.49
# s1,s2 7 23 11 0.83 0.86 挺相似的图片
# c1,c2 11 29 17 0.30 0.31
# 通过imread方法直接读取物理路径
img1 = cv2.imread(para1)
img2 = cv2.imread(para2)
hash1 = aHash(img1)
hash2 = aHash(img2)
n1 = cmpHash(hash1, hash2)
# print('均值哈希算法相似度aHash:', n1)
return n1
THRE_VALUE=35 # 相似度阈值
def sort_image():
# 图像需要保存的目录
aime_path=r"D:PycharmProjectstemp_fileaim_image"
# 原始图像目录
origin_path=r"D:PycharmProjectstemp_filesave_images"
aim_files = os.listdir(aime_path)
# 原始图像名称列表
ori_num_name=[]
# 需要备份的图像文件名称
aime_num_name=[]
origin_files = os.listdir(origin_path)
for ori_file in origin_files:
file_ = os.path.splitext(ori_file)[0]
ori_num_name.append(int(file_))
ori_num_name = sorted(ori_num_name) # 按照顺序由小到大进行排序
while ori_num_name:
name_pop = ori_num_name.pop(0)
# 判断需要备份的图像名称列表是否为空,为空,则添加作为第一个,否则进行图像相似度比较
if len(aime_num_name)==0:
aime_num_name.append(str(name_pop)+".jpg")
else:
# 进行比较,如果相似度大于阈值,则添加进aime_num_name中
ori_path = os.path.join(origin_path, str(name_pop) + ".jpg")
previous_path = os.path.join(origin_path, aime_num_name[-1])
# 进行哈希比较,得到两幅图像的相似度
hash_value=runAllImageSimilaryFun(ori_path,previous_path)
print(hash_value)
if hash_value>30:
aime_num_name.append(str(name_pop)+".jpg")
print(aime_num_name)
if __name__ == '__main__':
sort_image()