共计 2671 个字符,预计需要花费 7 分钟才能阅读完成。
【申明】度量两张图片的类似度有许多算法,本文将对罕用的图片类似度算法进行汇总。局部数据、材料来源于各技术网站,如有侵权烦请分割删除。
罕用的算法有几类:
一、Hash 算法
- Hash 算法罕用的有三种,别离为均匀哈希算法 (aHash)、感知哈希算法你(pHash) 和差别哈哈希算法(dHash);还有一种是小波哈希算法(whash)。
- Hash 算法都是通过获取图片的 hash 值,再比拟两张图片 hash 值的汉明间隔来度量两张图片是否类似。两张图片越类似,那么两张图片的 hash 数的汉明间隔越小。
1、aHash- 均匀哈希
算法步骤
均匀哈希算法是三种 Hash 算法中最简略的一种,它通过上面几个步骤来取得图片的 Hash 值:
(1) 缩放图片;
(2) 转灰度图;
(3) 算像素均值;
(4) 依据类似均值计算指纹.
失去图片的 ahash 值后,比拟两张图片 ahash 值的汉明间隔,通常认为汉明间隔小于 10 的一组图片为类似图片。
举栗
咱们以一张动物的图片为例,详解 ahash 算法过程:
原图:
缩放图片
先将图片缩放为 8 * 8 的图片,失去下图:
图片灰度
失去灰度图:
失去单通道灰度图的各个像素值
计算平均值
求得的平均值为 152.4375
每个像素点与平均值比拟
那么该图片的 ahash 值即为:1111100011110000111111001111011011100111111011101111000000001000
ahash 代码
import cv2
import numpy as np
import copy
def ahash_process(pic_path):
'''
ahash 算法过程
:param pic_path: 图片门路
:return:
'''
img = cv2.imread(pic_path, cv2.IMREAD_UNCHANGED)
img_resize = cv2.resize(img, (8, 8), cv2.INTER_AREA)
gray_img = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
print('单通道灰度图:', gray_img)
avg = np.mean(gray_img)
print('平均值:', avg)
dis = copy.deepcopy(gray_img)
dis_hash_str = ''
for x_index, x in enumerate(gray_img):
for y_index, y in enumerate(x):
if y >= avg:
dis[x_index, y_index] = 1
else:
dis[x_index, y_index] = 0
dis_hash_str += str(dis[x_index, y_index])
print('与平均值比拟:', dis)
print('该图片的 ahash 值:', dis_hash_str)
cv2.namedWindow('resize', 0)
cv2.resizeWindow('resize', 600, 600)
cv2.imshow('resize', img_resize)
cv2.namedWindow('gray', 0)
cv2.resizeWindow('gray', 600, 600)
cv2.imshow('gray', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
两张图片比照天然须要另外一张图片,同理通过上述办法,计算出 hash 值后,计算汉明间隔即可。
2、dHash- 差别哈希
算法步骤
dhash 和 ahash 算法的差异在于,ahash 应用每个像素点与均匀像素做比照得出布尔值,dhash 是应用以后像素与后一个像素点做比照失去布尔值,正是这个起因,所以 dhash 算法须要将图片缩放为 9 * 8 个像素点。
(1)图片缩放为 9 *8,保留构造,进来细节;(2)灰度化:转换为 256 阶灰度图;(3)求平均值:计算灰度图所有像素的平均值;(4)比拟:像素值大于后一个像素值记作 1,相同记作 0。本行不与下一行比照,每行 9 个像素,八个差值,有 8 行,总共 64 位;(5)生成 hash:将上述步骤生成的 1 和 0 按程序组合起来既是图片的指纹(hash);
举栗
原图:
缩放图片
先将图片缩放为 9 * 8 的图片,失去下图:
图片灰度
失去灰度图:
失去单通道灰度图的各个像素值
每个像素点与前面一个像素点比拟值
那么该图片的 dhash 值即为:0011011010111011010110101111001011010011101110011110101111001101
dHash 代码
import cv2
def dhash_process(pic_path):
img = cv2.imread(pic_path, cv2.IMREAD_UNCHANGED)
img_resize = cv2.resize(img, (9, 8), cv2.INTER_AREA)
gray_img = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
print('单通道灰度图:', gray_img)
dis = [[] for x in range(8)]
dis_hash_str = ''
for row in range(8):
for col in range(8):
if gray_img[row, col] >= gray_img[row, col + 1]:
dis[row].append(1)
dis_hash_str += str(1)
else:
dis[row].append(0)
dis_hash_str += str(0)
print('比拟值:', dis)
print('该图片的 dhash 值:', dis_hash_str)
cv2.namedWindow('resize', 0)
cv2.resizeWindow('resize', 600, 600)
cv2.imshow('resize', img_resize)
cv2.namedWindow('gray', 0)
cv2.resizeWindow('gray', 600, 600)
cv2.imshow('gray', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、SSIM 算法
SSIM(构造相似性度量),这是一种全参考的图像品质评估指标,别离从亮度、对比度、构造三个方面度量图像相似性。
参考文章:
https://cloud.tencent.com/dev…
https://www.cnblogs.com/Kalaf…
https://blog.csdn.net/u010977…