opencv 学习之 直方图

定义:
  • 直方图是图像中像素强度分布的图形表达方式.

  • 它统计了每一个强度值所具有的像素个数

函数:

CV_EXPORTS void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          SparseMat& hist, int dims,
                          const int* histSize, const float** ranges,
                          bool uniform=true, bool accumulate=false );


images:输入的图像

nimages:被求取直方图的图像个数,该函数可求多个图像的直方图

channels:图像的通道,它是一个数组,如果是灰度图像则 channels[1] = {0};如果是彩色图像则 channels[3] = {0,1,2};如果是某个通道的直方图,则channels[1]={N}

mask:是一个遮罩图像用于确定哪些点参与计算,默认情况我们都设置为一个空图像,即:Mat()

hist:计算得到的直方图

dims:得到的直方图的维数,灰度图像为1维,彩色图像为3维

histSize:直方图横坐标的区间数。如果是10,则它会横坐标分为10份,然后统计每个区间的像素点总和。8位图像取值0-255,则一般设置为256即可,计算每个像素点数

ranges:这是一个二维数组,用来指出每个维度的范围

最后两个参数缺省即可

代码:

int showHist()
{
	Mat img, gray;
	img = imread("d://2.bmp");
	if(img.empty()) return -1;
	if(img.channels() == 1)
		gray = img.clone();
	else cvtColor(img, gray, CV_RGB2GRAY);

	double minVal, maxVal;
	minMaxLoc(gray, &minVal, &maxVal, 0, 0);
	cout<<"minVal : "<<minVal<<endl;
	cout<<"maxVal : "<<maxVal<<endl;

	MatND hist;
	int bins = 10;  
	int hist_size[] = {bins};  
	float range[] = { 0, 256 };  
	const float* ranges[] = { range};  

	int channels[] = {0};  
	calcHist( &gray, 1, channels, Mat(), 	hist, 1, hist_size, ranges,  true, false);  

	//直方图高度
	int height=gray.rows;  
	double max_val;
	//直方图列宽度
	int scale = 10;
	//计算直方图最大值
	minMaxLoc(hist, 0, &max_val, 0, 0); 
	//创建一个直方图图像并初始化为0 
	MatND imgHist = Mat::zeros(height, bins*scale, CV_8UC1); 
	cout<<"max_val = "<<max_val<<endl;
	for(int i=0;i<bins;i++)  
	{  
		//	第i灰度级上的数	
		float bin_val = hist.at<float>(i);
		//要绘制的高度  
		int intensity = cvRound(bin_val*height/max_val); 
		//填充第i灰度级的数据
		rectangle(imgHist,Point(i*scale,height-1),  Point((i+1)*scale - 1, height - intensity),  Scalar(255,255,255));  
	}
	imshow( "Hist", imgHist );

	waitKey();  
	return 0;  
}





猜你喜欢

转载自blog.csdn.net/u010477528/article/details/59124263
今日推荐