OpenCV:calcHist计算图像直方图( 二 )


③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与多图像下直方图的显示与存储有关;

OpenCV:calcHist计算图像直方图

文章插图

3注重的处所:
关于calHist计较直方图的成果hist,
hist的成果为统计的灰度级0,1, …, 255的数目;
暗示一维或三维的矩阵;
对于直方图成果矩阵, 拜候形式为:
cout<<hist.at<float>(i)<<l;

OpenCV:calcHist计算图像直方图

文章插图

4灰度图的直方图绘制:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\core\core.hpp>
using namespace std; 
using namespace cv; 
int main() 

       Mat srcImage = imread("mask.jpg"); 
       imshow("【原图】", srcImage); 
       int channels = 0; 
       MatND dstHist; 
       //接下来是直方图的每一个维度的柱条的数量 
       int histSize[] = { 256 };
       //若是这里写当作int histSize = 256;
       //那么下面挪用计较直方图的函数的时辰, 该变量需要写 &histSize 
       //界说变量用来存储单个维度的数值的取值规模 
       float midRanges[] = { 0, 256 }; 
       const float *ranges[] = { midRanges }; 
       calcHist(&srcImage, 1, &channels, Mat(), dstHist, 1, histSize, ranges, true, false); 
       //calcHist 函数挪用竣事后,
       //dstHist变量中将储存了直方图的信息;
       //用dstHist的模版函数 at<Type>(i)获得第i个柱条的值 
       //at<Type>(i, j)获得第i个而且第j个柱条的值   
       Mat drawImage = Mat::zeros(Size(256, 256), CV_8UC3); 
       double g_dHistMaxValue; 
       minMaxLoc(dstHist, 0, &g_dHistMaxValue, 0, 0); 
       for (int i = 0; i < 256; i++) 
       { 
              int value = https://vvvtt.com/article/cvRound(dstHist.at(i) * 256 * 0.9 / g_dHistMaxValue);

推荐阅读