作用:计算一维或多维图像直方图
c++原型:
参数:
- images:输入图像的指针,一定是同样的深度(CV_8U or CV_32F)。且一个图像可以有多个channes。
- nimages:输入图像的个数
- channels:计算直方图的channes的数组。如果输入的图像的个数为2,第一张图像有0,1,2共三个channel,第二张图像只有0一个channel,那么输入就一共有4个通道,如果int channels[3] = {3, 0, 1},那么就表示是使用第二张图像的第一个通道和第一张图像的第0和第1个通道来算
- mask:掩码。跟前面说的mask一致,非0区域才会用来做直方图的计算。如果不用就表示完整计算整张图像,这时Mat()参数为空。如果要用mask,那么它必须是一个8位(CV_8U)的数组,并且它的大小的和images[i]的大小相同,值为1的点用来计算
- hist:计算出来的直方图
- dims:计算出来的直方图的维数,这里是一维的,如果想要二维可以定义一个数组,数组里有两个值
- histSize:在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数。
- ranges:用来进行统计的范围 例如:float scope[] = {100, 255};const float *rangs[1] = { scope };那么就是对100-255的范围的值进行统计。多个范围可再定义数组
- uniform:每一个竖条的宽度是否相等
- accumulate:是否累加。如果为true,在下次计算的时候不会首先清空直方图
原始二维直方图
void test1::hist2d_drawing(Mat &image)
{
Mat hsv,hs_hist;
cvtColor(image,hsv,COLOR_BGR2HSV);
int hbins = 30,sbins = 32;
int hist_bins[] = {hbins,sbins};
float h_range[] = {0,180};
float s_range[] = {0,256};
const float* hs_ranges[] = {h_range,s_range};
int hs_channels[] = {0,1};
calcHist(&hsv,1,hs_channels,Mat(),hs_hist,2,hist_bins,hs_ranges,true,false);
double maxValue = 0;
minMaxLoc(hs_hist,0,&maxValue,0,0);
int scaleVal = 10;
Mat hist2d_img = Mat::zeros(sbins*scaleVal,hbins*scaleVal,CV_8UC3);
for(int h=0;h(h,s);
int itensity = cvRound(binVal * 255 /maxValue);
rectangle(hist2d_img,Point(h*scaleVal,s*scaleVal),
Point((h+1)*scaleVal-1,(s+1)*scaleVal-1),Scalar::all(itensity),-1);
}
}
imshow("hist2d_drawing1", hist2d_img);
}
1、applyColorMap(hist2d_img,hist2d_img,COLORMAP_JET);可以绘制出不同颜色的二维直方图,第三个参数是不同的颜色,如下
// COLORMAP_AUTUMN,
// COLORMAP_BONE,
// COLORMAP_JET,
// COLORMAP_WINTER,
// COLORMAP_RAINBOW,
// COLORMAP_OCEAN,
// COLORMAP_SUMMER,
// COLORMAP_SPRING,
// COLORMAP_COOL,
// COLORMAP_HSV,
// COLORMAP_PINK,
// COLORMAP_HOT,2、转到HSV空间更容易对图像进行处理
原创不易,转载请注明出处:
Qt+OpenCV联合开发(二十四)--图像二维直方图(calcHist)