【申明】度量两张图片的类似度有许多算法,本文将对罕用的图片类似度算法进行汇总。局部数据、材料来源于各技术网站,如有侵权烦请分割删除。
罕用的算法有几类:

一、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 cv2import numpy as npimport copydef 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 cv2def 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...