图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。
OpenCV中计算图像直方图的函数是:
void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform, bool accumulate) (C++ function, in Histograms)
源代码链接:
http://docs.opencv.org/2.4.13.2/modules/imgproc/doc/histograms.html?highlight=calchist#void
参数:
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参数表明直方图是否等距,最后一个参数与多图像下直方图的显示与存储有关。
int main()
{
Mat Image=imread("Lenna.png");
cvtColor(Image,Image,CV_BGR2GRAY);
const int channels[1]={0};
const int histSize[1]={256};
float hranges[2]={0,255};
const float* ranges[1]={hranges};
MatND hist;
calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges);
return 0;
}
注:OpenCV2.2以前的版本里它们稍微有点区别:
Mat特指2维矩阵
MatND是多维矩阵(>=3维)
但2.2以后它们被统一成Mat,Mat可以表示任意维矩阵
所以没必要在意MatND和Mat的区别,如果你用的是2.2以后的版本,统一使用Mat就行了。