/*
参考
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;
}
opencv操作:灰度直方图的显示及操作
最新推荐文章于 2024-07-31 14:06:33 发布