- 直方图概念:
在直方图中,所有空间信息全部丢失,每一灰度值对应的像素个数可直接得到,一幅图各个子区的直方图之和等于改图全图的直方图。假设有图像数据8x8,像素值范围0~14共15个灰度等级,统计得到各个等级出现次数及直方图如右侧所示,每个紫色的长条叫BIN。
图像直方图,是指整个图像在灰度范围内的像素(0-255)统计出现频率次数,直观反映图像灰度的分布情况,是图像的统计学特征。上述直方图概念是基于图像像素值,其实对图像梯度、每个像素的角度、等一切图像的属性值,我们都可以建立直方图。这个才是直方图的概念真正意义,不过是基于图像像素灰度直方图是最常见的。如下图所示:
- 直方图均衡化
是一种提高图像对比度的方法,拉伸图像灰度值范围,将灰度值分布到0~255的范围,对在图像中像素个数多的灰度级,对像素个数少的灰度级进行缩减,达到清晰图像的目的,也就是进行图像重映射修改像素值。操作的图像是灰度图像。
下图第一张为灰度图像,第二张为均衡化的图像。
- 直方图比较
对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间,然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。首先把图像从RGB色彩空间转换到HSV色彩空间。
(1) 相关性计算
其中N是直方图的BIN个数.
[{ m{d}}left( {{H_1},{H_2}} ight) = frac{{sum olimits_I {left( {{H_1}left( I ight){ m{ - }}{H_1}} ight)left( {{H_2}left( I ight){ m{ - }}{H_2}} ight)} }}{{sqrt {sum olimits_I {{{left( {{H_1}left( I ight){ m{ - }}{{ar H}_1}} ight)}^2}sum olimits_I {{{left( {{H_2}left( I ight){ m{ - }}{{ar H}_2}} ight)}^2}} } } }}]
$${{ m{ar H}}_{ m{k}}} = frac{1}{N}sumlimits_J {{{ m{H}}_{ m{k}}}left( J ight)} $$
(2) 卡方计算
H1,H2分别表示两个图像的直方图数据
[{ m{d}}left( {{H_1},{H_2}} ight) = sumlimits_{ m{I}} {frac{{{{left( {{H_1}left( { m{I}} ight){ m{ - }}{H_2}left( { m{I}} ight)} ight)}^2}}}{{{H_1}left( { m{I}} ight)}}} ]
(3) 十字计算
[{ m{d}}left( {{H_1},{H_2}} ight) = sumlimits_{ m{I}} {min left( {{H_1}left( { m{I}} ight),{H_2}left( { m{I}} ight)} ight)} ]
(4) 巴氏距离计算
[{ m{d}}left( {{H_1},{H_2}} ight) = sqrt {1{ m{ - }}frac{1}{{sqrt {{{ar H}_1}{{ar H}_2}{{ m{N}}^2}} }}sumlimits_{ m{I}} {sqrt {{H_1}(I) ullet {H_2}(I)} } } ]
- 直方图反向投影
反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。下图为一个车辆图片在直方图反映射的结果。
1 直方图均衡化:equalizeHist(int_image,out_image); 2 3 归一化处理,使不同量程对应转化: 4 normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat()); 5 分通道显示:split(src, bgr_planes); 6 //将多通道图像转化为单通道数组,vector<Mat> bgr_planes; 7 8 直方图计算:calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false); 9 // &bgr_planes[0] 为输入图像指针,1图像数目,0通道数,Mat()输入mask,b_hist输出的直方图数据,用于去绘制此通道直方图,1维数,&histSize直方图级数为0-180,&histRanges值域范围为0-255. 10 11 对浮点数进行四舍五入:cvRound(); 12 13 直方图比较得出相似结果:double basetest1 = compareHist(hist_base, hist_test1, CV_COMP_INTERSECT); 14 //参数分别为输入的两个比较图像,以及选择的比较方式。 15 //convertToString(basetest1)可已将结果转化为字符显示在图片上,将此函数直接写在putText()中显示字符的的位置即可。 16 17 计算反向投影:calcBackProject(&hue, 1, 0, h_hist, backPrjImage, &histRanges, 1, true); 18 //&hue输入图像,1图像数目,0通道数,h_hist为寻找目标的直方图模型。 19 //backPrjImage为返回寻找到的目标图像,&histRanges为直方图级数为0-180。