直方图的计算很简单,无非就是遍历图像的像素,统计每个灰度级的个数,opencv中calcHist函数能够同时计算过个图像,多个通道,不同灰度范围的灰度直方图。
voidcalcHist(const Mat* images,int nimages,constint* channels, InputArray mask,
OutputArray hist,int dims,constint* histSize,constfloat** ranges,bool uniform =true,bool accumulate =false);
images 输入的图像
nimages 输入的图像个数
channels 统计直方图第几通道
mask 可选的操作掩码
hist 输出的直方图数组
dims 需要统计直方图通道的个数
histSize 直方图分成多少个区间
ranges 像素值区间
uniform 是否进行归一化处理
accumulate 在多个图像时是否计算像素值个数
接下来直接看代码:
Mat img;
img =imread("猫1.jpg",0);int channels[]={0};int bins =256;
Mat hist;int hist_size[]={ bins };float range[]={0,256};constfloat*ranges[]={ range };calcHist(&img,1,0,Mat(), hist,1, hist_size, ranges);double max_val;minMaxLoc(hist,0,&max_val);//定义矩阵中最小值,最大值的位置int scale =2;int hist_height =256;
Mat hist_ing =Mat::zeros(hist_height, scale*bins, CV_8UC3);for(int i =0; i < bins; i++){float bin_val = hist.at<float>(i);//图像的灰度频率表int inten =cvRound(bin_val*hist_height / max_val);//绘制高度rectangle(hist_ing,Point(scale*i, hist_height -1),Point((i +1)*scale -1, hist_height - inten),CV_RGB(255,255,255));}imshow("直方图", hist_ing);waitKey(0);
效果如下:
本文转载自: https://blog.csdn.net/Lightismore/article/details/123926939
版权归原作者 浅念念52 所有, 如有侵权,请联系我们删除。
版权归原作者 浅念念52 所有, 如有侵权,请联系我们删除。