前文链接
文中没提到的东西,很可能都在前文描述过
C#描述-计算机视觉OpenCV(1):基础操作
C#描述-计算机视觉OpenCV(2):图像处理
C#描述-计算机视觉OpenCV(3):重映射
C#描述-计算机视觉OpenCV(4):图像分割
图像直方图
图像由各种数值的像素构成。例如在单通道灰度图像中,每个像素都有一个 0(黑色)~255(白色)的整数。对于每个灰度,都有不同数量的像素分布在图像内,具体取决于图片内容。直方图是一个简单的表格,表示一幅图像(有时是一组图像)中具有某个值的像素的数量。
因此,灰度图像的直方图有 256 个项目,也叫箱子(bin)。0 号箱子提供值为 0 的像素的数量,1 号箱子提供值为 1 的像素的数量,以此类推。很明显,如果把直方图的所有箱子进行累加,得到的结果就是像素的总数。你也可以把直方图归一化,即所有箱子的累加和等于 1。这时,每个箱子的数值表示对应的像素数量占总数的百分比。
直方图或者说对色彩的统计,是很多算法的基础。本文将以此图为例,来生成在直方图:
灰度直方图的计算
首先,我们要把原图通过CvtColor函数转换为一个灰度图像:
然后我们拿着这张图,代入CalcHist函数。
这个直方图生成函数的参数为:
int histSize[1]; // 直方图中箱子的数量
float hranges[2]; // 值范围
const float* ranges[1]; // 值范围的指针,C#中,我们直接使用rangef
int channels[1]; // 要检查的通道数量
以及一个转换为Mat[] 的Mat灰度图像,以及一个hist作为结果输出
对于这张图,由于是一个0-255的单通道灰度图像,hist是一个Mat一维数组,大小为256,值域根据原图像素,心里也可以有个估计,每个色块的总数大约占比多少,然后可以直接输出出来检视结果。
public void GetHistogram(Mat img)
{
Mat hist = new Mat();
Mat grayImg = new Mat();
Cv2.CvtColor(img, grayImg, ColorConversionCodes.BGR2GRAY);
Mat[] vimg = new Mat[] {
grayImg };
int[] channels = new int[] {
0 };// 要检查的通道数量
Rangef[] ranges = new Rangef[] {
new Rangef(0, 256) };// 值范围与指针
int[] histSize = new int[] {
256 };// 直方图中箱子的数量
int dims = 1; //需要统计的特征数目(只统计灰度图单通道)
Cv2.CalcHist(vimg, channels, new Mat(), hist, dims,histSize, ranges);
Cv2.ImShow