,256}; float hranges[2]={0,255}; const float* ranges[3]={hranges,hranges,hranges}; MatND hist; calcHist(&Image,1,channels,Mat(),hist,3,histSize,ranges); return 0; }
不均匀直方图,我们分别统计0-50,50-80,80-150,150-230,230-255区间的灰度分布:
int main() { Mat Image=imread("../cat.png"); cvtColor(Image,Image,CV_BGR2GRAY); const int channels[1]={0}; int histSize[1]={5}; float hranges[6]={0,50,80,150,230,255}; const float* ranges[1]={hranges}; MatND hist; calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges,false); return 0; }
三、直方图的显示
从上面的例子中我们可以看出,直方图计算得到的实际上是一个多维数组,这并不够直观,我们希望能够像在Excel中把相关数据通过表的形式表示出来。
下面通过划线函数来把一个灰度直方图显示出来:
Mat getHistImg(const MatND& hist) { double maxVal=0; double minVal=0; //找到直方图中的最大值和最小值 minMaxLoc(hist,&minVal,&maxVal,0,0); int histSize=hist.rows; Mat histImg(histSize,histSize,CV_8U,Scalar(255)); // 设置最大峰值为图像高度的90% int hpt=static_cast<int>(0.9*histSize); for(int h=0;h<histSize;h++) { float binVal=hist.at<float>(h); int intensity=static_cast<int>(binVal*hpt/maxVal); line(histImg,Point(h,histSize),Point(h,histSize-intensity),Scalar::all(0)); } return histImg; }
四、直方图变换
直方图变换是图像处理中一个很重要的概念,图像直方图可以反映出图像对比度,明暗程度等特征,所以我们可以利用直方图的变换进行图像画面的调节。