由于最近涉及到匹配照片相似图爿的问题所以在此记录下解决办法:差异值哈希算法 + 颜色直方图
检索相似图片,第一个想到的就是差异值哈希算法
这个算法的步骤是:
-
一般将图片缩放为
- 对比不同图片的汉明距离
对比两个图片生成的整数有多少位鈈一样。一般汉明距离小于 5 两张图片的相似度就很高了。
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位的整数
差异值哈希算法的 Python 代码
# 每行前一个颜色强度大于后一个值为1,否则值为0由于差异值哈希失去了太多的细节适合比较原图或者缩略图。所以我再加上颜色直方图的比较计算图片间的接近程度用以排除部分像素的微小差异。
-
一般将图片缩放为
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截图来自于
总的来说:差异值哈希算法 + 颜色直方图 解決了我的相似图片匹配照片问题。