opencv操作:灰度直方图的显示及操作



/*
参考

https://blog.csdn.net/zqx951102/article/details/102326231
https://blog.csdn.net/xiaowei_cqu/article/details/8833799

*/

//绘制灰度直方图
int main(  )
{
	Mat src,gray;
	src=imread("baboon.jpg");
	cvtColor(src,gray,CV_RGB2GRAY);
	int bins = 256;
	int hist_size[] = {bins};
	float range[] = { 0, 256 };
	const float* ranges[] = { range};
	MatND hist;
	int channels[] = {0};
 
	calcHist( &gray, 1, channels, Mat(), // do not use mask
		hist, 1, hist_size, ranges,
		true, // the histogram is uniform
		false );
 
	double max_val=0;
	double min_val=0;
    minMaxLoc(hist, &min_val, &max_val, 0, 0);
    
    
	
	int scale = 2;
	int hist_height=256;
    
    
	Mat hist_img = Mat::zeros(hist_height+13, bins*scale, CV_8UC3);
	for (int i = 0; i<bins; i++)
	{
		float bin_val = hist.at<float>(i);
		int intensity = cvRound(bin_val*hist_height / max_val);  //要绘制的高度
		rectangle(hist_img, Point(i*scale+13, hist_height - 1),
			Point((i + 1)*scale+13 - 1, hist_height - intensity),
			CV_RGB(255, 255, 255));
	}
	
	//刻画垂直刻度
	char string[100];
	CvFont font;
	double font_size = 1;//字体大小
	cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, 8);//字体结构初始化 
	Size text_size;

	int hpt = saturate_cast<int>((hist_img.rows - 13)*0.95); //最大值对应的Y坐标,防止溢出
	for (int i = hpt; i >= 0; )
	{
		_itoa(max_val*i / hpt, string, 10);//把一个整数转换为字符串  
											//在图像中显示文本字符串  
		text_size = getTextSize(string, CV_FONT_HERSHEY_PLAIN, font_size, 1, NULL);	//获得字体大小
		putText(hist_img, string, cvPoint(0, hist_img.rows - i - 13 + text_size.height / 2), cv::FONT_HERSHEY_PLAIN, font_size, Scalar(0, 255, 0), 1, 8, 0);
		i -= hpt / 10;	//只显示10个刻度
	}


	//刻画水平刻度
	for (int i = 256; i >= 0;)
	{
		_itoa(i, string, 10);//把一个整数转换为字符串  
							 //在图像中显示文本字符串  
		text_size = getTextSize(string, CV_FONT_HERSHEY_PLAIN, font_size, 1, NULL);	//获得字体大小
		putText(hist_img, string, cvPoint(i*scale+13 - text_size.width / 2, hist_img.rows), cv::FONT_HERSHEY_PLAIN, font_size, Scalar(0, 0, 255), 1, 8, 0);
		i -= 256 / 16;	//只显示20个刻度
	}
	


	imshow("灰度图", hist_img);
	
    waitKey(10000000000);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值