【申明】度量两张图片的类似度有许多算法,本文将对罕用的图片类似度算法进行汇总。局部数据、材料来源于各技术网站,如有侵权烦请分割删除。
罕用的算法有几类:
一、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://www.gaodaima.com/u010977…