直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,因此它的Y轴实际大小,和图像的尺寸有很大关系。同一幅图片,只要改变其尺寸,输出的直方图虽然在整体形状上相似,但肯定会有不同的Y轴最大值。假设原始图像是100 * 100大小,像素值36一共出现25次。那么将其放大到200 * 200,像素值36就会出现100次,Y轴最大值变成了原来的4倍。
为了去掉这个弊端,引入了直方图归一化功能,就是是将原始直方图中每个像素值出现的次数,除以图像总像素数得到新的直方图。这样做就可以将不同分辨率、不同大小的图像进行比较和分析。
基本原理还是根据如下代码,求出原始直方图
CvInvoke.CalcHist(vMatImgs, channelIndex, new Mat(), histogram, hitSize, ranges, false);
直方图就是histogram这个参数,读者可以试一试,原始图像和放大一倍后的图像,用相同的代码,得到的histogram是不一样的,然后再归一化,执行如下代码:
Mat normalizeHistogram = new Mat();
CvInvoke.Normalize(histogram, normalizeHistogram, 0, 255, NormType.MinMax, histogram.Depth);
得到新的直方图结果normalizeHistogram,原始图像和放大(缩小)后的图像,计算得出的normalizeHistogram值就完全相同了。
原创不易,请勿抄袭。共同进步,相互学习。