由于最近涉及到匹配相似图片的问题,所以在此记录下解决办法:差异值哈希算法 + 颜色直方图
环境要求:Python cv2库 math库
差异值哈希算法
检索相似图片,第一个想到的就是差异值哈希算法
。这个算法的步骤是:
缩小尺寸
一般将图片缩放为8 * 8
的尺寸大小,共64个像素的图片。但是由于64个像素对于我来说,损失的细节太多所以我选择了缩放到33 * 32
的尺寸大小彩色图像灰度化
由于我们现有的图片是由 RGB 三原色构成,每个像素点是一个由这三个颜色组成的一个 list 。而 RGB 三个颜色中每个颜色值都是用 8 个比特来表示,大小范围是 0 ~ 255(2^8 - 1),就一共有256 * 256 * 256
种颜色。并且作为一个像素类似于这样的数值:[253 255 255] 是不利于简单比较的,肉眼看着类似的颜色,但是它的三个颜色分布可能相差很多。所以将它灰度化,用 256 个不同的灰色表示现有的图片。由于现在用一种灰色表示三种颜色,原来每个像素是一个 list 现在就降维成一个数值,数值的大小还是比较容易比较的。比较像素的灰度值
比较图片灰度化的每行相邻像素之间的大小,每行后面像素值大于前面一个像素值那么记为1,如果不大于则记为0计算哈希值
根据上一步得到了由0和1构成的数组合在一起就构成了1024位的整数对比不同图片的汉明距离
对比两个图片生成的整数有多少位不一样。一般汉明距离小于 5 ,两张图片的相似度就很高了。
差异值哈希算法的 Python 代码
|
|
颜色直方图
由于差异值哈希失去了太多的细节,适合比较原图或者缩略图。所以我再加上颜色直方图的比较计算图片间的接近程度,用以排除部分像素的微小差异。
缩小尺寸
一般将图片缩放为8 * 8
的尺寸大小,共64个像素的图片。但是由于64个像素对于我来说,损失的细节太多所以我选择了缩放到32 * 32
的尺寸大小降低位深
原来 RGB 每个颜色都有 256 种变化,现在做一个映射,将原来的 256 分为 8(3个比特表示) 个颜色区间。类似旧的 0 - 31 对应新的颜色 0,以达到降低计算的效果计算像素值
由于降低了位深,图片颜色值变小。每个颜色值不大于8(0 - 7),然后我们给三元素不同的权重,分别为8 * 8
,8
,1
作为数组的 key,用以统计每个颜色的像素出现次数,并且不会出现不同颜色统计到了同一个 key 值下的目的。计算相似度
计算出像素值后得到,我们得到了以不同颜色的数值为 key,出现次数为 value 的数组。这时候我们可以使用用余弦相似度去计算相同颜色出现次数的相似度,越是相似的像素最后值越接近于1。截图来自于WiKi
颜色直方图的 Python 代码
|
|
总结
总的来说:差异值哈希算法 + 颜色直方图 解决了我的相似图片匹配问题。
参考资料
(完)
- 本文作者:Cindy
- 本文标题:Create Custom Demain Name Of Github Pages
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享4.0许可证)