OpenCV 2410
calcHist三种函数原型:opencv中自带了求算图像直方图的函数calhist(),函数原型如下:①void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false ); ②void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false ); ③void calcHist( InputArrayOfArrays images, const vector
calcHist参数详解:以第一个函数原型为例:①const Mat* images:为输入图像的指针;②int nimages:要计算直方图的图像的个数。此函数可以为多图像求直方图,我们通常情况下都只作用于单一图像,所以通常nimages=1。③const int* channels:图像的通道是一个数组,如果是灰度图像则channels[1]={0};如果是彩色图像则channels[3]={0,1,2};如果只是求彩色图像第2个通道的直方图则channels[1]={1};④IuputArray mask:掩膜,仅对指定元素操作,默认情况设置为一个空图像,即:Mat()。⑤OutArray hist:计算得到的直方图⑥int dims:得到的直方图的维数,灰度图像为1维,彩色图像为3维⑦const int* histSize:直方图横坐标的区间数。如果是10,则它会横坐标分为10份,然后统计每个区间的像素点总和⑧const float** ranges:这是一个二维数组,用来指出每个区间的范围⑨uniform参数表明直方图是否等距,⑩accumulate与多图像下直方图的显示与存储有关;
注意的地方:关于calHist计算直方图的结果hist,hist的结果为统计的灰度级0,1,…,255的数量;表示一维或三维的矩阵;对于直方图结果矩阵,访问形式为:cout<
灰度图的直方图绘制:#include
彩色直方图的绘制:int main() { Mat srcImage = imread('mask.jpg'); imshow('【原图】', srcImage); int channels = 0; MatND dstHist; int histSize = 256 ; float midRanges[] = { 0, 256 }; const float *ranges[] = { midRanges }; calcHist(&srcImage, 1, &channels, Mat(), dstHist, 1, &histSize, ranges, true, false); //绘制蓝色通道 Mat b_drawImage = Mat::zeros(Size(256, 256), CV_8UC3); double g_dHistMaxValue = 0; minMaxLoc(dstHist, 0, &g_dHistMaxValue, 0, 0); for (int i = 0; i < histSize; i++) { int value = cvRound(dstHist.at
【注】:calhist()函数求得的直方图返回值是一个一维或三维等的矩阵;不是二维;通过hist.at
hist.at(i):访问的格式
彩色直方图的生成;