文章目录
5.2 理解直方图分析
直方图是对图像中每种颜色出现的次数的计数。通常,我们不单独计算所有可能的颜色;相反,我们把类似的颜色归类到一个单元中。在单元数较少的情况下,直方图占用的内存更少,提供了更粗略的比较基础。通常,我们希望在很多的单元(整个图像像素变化很大)和很少的单元(整个图像像素区域平淡)之间选择中间地带。BeanCounter,我们设定为32单元/通道(或一共32 ^ 3 = 32678单元),但你可以在代码中改变这个值来测试效果。
比较直方图可以告诉我们两个图像是否含有相似的颜色。这种相似性本身并不一定意味着图像中包含匹配的对象。例如,银叉和银币可能有类似的直方图。OpenCV支持几种流行的比较算法。我们将使用Alternative Chi-Square算法,该算法进行距离(不相似度)的度量,它严重凸显了一种颜色在一幅图像中很少见,但在另一幅图像中很常见的情况。下面是用数学符号表示的算法:
下面是等效的伪代码,它在两个一维的直方图中遍历对应的单元:
function altChiSq(hist0, hist1):
assert(hist0.length == hist1.length)
dist = 0
i = 0
while i < hist0.length:
dist += (hist0[i]-hist1[i])^2 / (hist0[i]+hist1[i])
i += 1
dist *= 2
return dist
多维情况是类似的,只是它们涉及多个索引和嵌套的循环。
[所有的OpenCV的直方图比较算法和公式都可以在官方文档"http://docs.opencv.org/3.1.0/d6/dc7/group__imgproc__hist.html#ga994f53817d621e2e4228fc646342d386"中查看]
OpenCV提供了函数cv::clacHist
和cv::compareHist
来计算直方图,以及测量他们的相似度.OpenCV用一个一维矩阵来代表一个颜色通道的直方图.如果在BGR图片中,使用3个通道的话,直方图就有3个维度.
[记住在OpenCV中,多维矩阵与多通道矩阵不同,许多OpenCV函数不能处理二维以上的矩阵。]