在C++版opencv中简化了对Hist数据结构的复杂性。
直方图计算原理
重要函数
计算直方图函数原型:
//! computes the joint dense histogram for a set of images.
CV_EXPORTS void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,
OutputArray hist, int dims, const int* histSize,
const float** ranges, bool uniform=true, bool accumulate=false );
结合原理说明:images为输入图像序列;nimages输入图像数;channels一维数组,指明图像的哪些通道被计算(从0开始,为0,1,2,3,4,....的子集);
mask掩码,为空时使用Mat();hist统计数据,维数取决后面的dims;histSize指明bins的个数;ranges指明每一bins范围。
具体参考:http://www.tuicool.com/articles/b2iYzm
归一化:
#include "cv.h"
#include "highgui.h"
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
Mat src,srcGray,hist;
src=imread("src.jpg");
cvtColor(src,srcGray,CV_BGR2GRAY);
int histSize=256,channels=0;
float range[]={0,255};
const float *histRange={range};
calcHist(&srcGray,1,&channels,Mat(),hist,1,&histSize,&histRange,true,false);
int histHigh=200;
Mat histImage(histHigh,histSize*5,CV_8UC1,Scalar(0,0,0));
normalize(hist,hist,0,histHigh,NORM_MINMAX,-1,Mat());
for (int i=0;i<histSize;i++)
line(histImage,Point(i*5+1,histHigh-1),Point(i*5+1,cvRound(histHigh-1-hist.at<float>(i))),Scalar::all(255),2);
imshow("histImage",histImage);
waitKey(0);
destroyAllWindows();
return 0;
}
效果:
均衡化后的结果: