判断两张图片是否类似

如何判断两张图是否相似?
查到了很多算法,流程都是“特征提取”,“特征对比”。以下列出了三个常见算法
### 平均哈希算法
平均哈希算法是三种Hash算法中最简单的一种,它通过下面几个步骤来获得图片的Hash值,这几个步骤分别是(1) 缩放图片;(2)转灰度图; (3) 算像素均值;(4)根据相似均值计算指纹。具体算法如下所示:
![1.1 aHash得到图片Hash值地算法](http://image.openwrite.cn/29750_A0045D8886DE48128013B659BEDDB990)
得到图片的ahash值后,比较两张图片ahash值的汉明距离,通常认为汉明距离小于10的一组图片为相似图片。
#### 例子:
![1.2 原图以及灰度后的图像](http://image.openwrite.cn/29750_AE2B45CFB332405F9B48B099B864CA5B)
##### 其中转为8x8尺寸的Lena对应的数据矩阵为:
![1.3 数据矩阵](http://image.openwrite.cn/29750_065325D03C514C20A43328CA226C5B5F)
##### 很容得到如上矩阵所有元素的均值a= 121.328125, 将上述矩阵中大于或等于a的元素置为1, 小于a的元素置为0,可得:
![1.4转换为1的矩阵](http://image.openwrite.cn/29750_0275515BDF5C4092861D40563C3CDE65)
所以可得Lena图的aHash为

1011111010011110100111011010100110101011101000110000111000101100

将二进制形式ahash转十六进制hash为

be9e9da9aba30e2c
将两张图片进行平均hash后,再计算出各自的汉明距离
##### 图Lena(noise):
![图Lena(noise)](http://image.openwrite.cn/29750_D0517BAB48194BF89F97D2B865D2B109)
##### 图Barbara:
![图Barbara](http://image.openwrite.cn/29750_998875A81A71424184A93C603B7FE3C2)
##### 图汉明距离:
![图汉明距离](http://image.openwrite.cn/29750_BB6508EFD8D44E04A365E05C2813E8BC)
### 感知哈希算法
感知哈希算法是三种Hash算法中较为复杂的一种,它是基于DCT(离散余弦变换)来得到图片的hash值(补充:关于DCT具体如何转换参考 https://www.jianshu.com/p/b923cd47ac4a ),其算法几个步骤分别是(1) 缩放图片;(2)转灰度图; (3) 计算DCT;(4)缩小DCT; (5)算平均值;(6) 计算指纹。具体算法如下所示:
![感知hash的步骤](http://image.openwrite.cn/29750_F082CD76A72949BC93098BA03855384E)
### 差异哈希算法
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。其算法几个步骤分别是(1) 缩放图片(2)转灰度图; (3)算差异值;
(4)算平均值; (5)计算指纹。具体算法如下所示:
![差异哈希流程](http://image.openwrite.cn/29750_E3FACFC6E6F24FAFB2CF97576DCE3850)

具体平均hash的测试代码详见:
https://github.com/yuanting2016/similarpicture

posted @ 2022-09-14 17:29  乔瑟琳  阅读(177)  评论(0)    收藏  举报