C++OpenCV下绘制灰度直方图

这篇博客介绍了如何利用OpenCV的calcHist函数在C++中计算并绘制8位灰度图像的直方图。通过GetHist函数统计图像的灰度分布,并使用ShowHist函数在512x400的黑色背景图上绘制直方图。直方图可以帮助分析图像的亮度和对比度分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++OpenCV下绘制直方图
直方图的定义:灰度直方图是对一幅灰度图像素分布的统计。对于一幅8Bit量化的图像来说。就是统计在0~255各个灰度级上,像素点的个数或者密度。
在OpenCV库提供了 calcHist()方法用于得到图像的直方图。
具体函数的调用方法如下:
void cv::calcHist(const Mat*images,int nimages,const int *channels,InputArrary mask,OutputArrary hist,int dims,const int* histSize,const float **ranges,bool uniform=true,bool accumulate=false)
//参数说明
//images:带统计直方图的图像数组
//nimages:输入图像的数目
//channels:需要统计的通道索引数组 一般灰度图就是
### 使用 OpenCVC++ 实现灰度图直方图绘制 为了实现这一功能,程序通常分为几个部分:读取图像、转换为灰度模式、计算直方图以及最终绘制直方图。 #### 1. 初始化环境与加载图片 首先需要导入必要的头文件,并初始化OpenCV环境。接着通过`imread()`函数载入待分析的彩色或灰度图像。如果输入的是彩色图像,则需将其转化为灰度形式以便后续操作[^2]。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("example.jpg"); if (src.empty()) return -1; Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); } ``` #### 2. 计算灰度直方图 使用`calcHist()`方法可以方便地获取给定图像中各个亮度级别的频率分布情况。此过程涉及设置参数如通道数目、区间范围等,具体配置取决于所使用的版本和需求[^3]。 ```cpp Mat hist; int histSize = 256; // 灰度级数 float range[] = {0, 256}; const float* histRange = &range; bool uniform = true, accumulate = false; calcHist(&gray, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); ``` #### 3. 创建用于展示的空白画布 建立一个新的矩阵作为背景板,在其基础上描绘出实际的数据图形。这里设定了固定的宽高比例来适应大多数屏幕尺寸[^4]。 ```cpp int hist_w = 512, hist_h = 400; int bin_w = cvRound((double) hist_w / histSize); Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0,0,0)); ``` #### 4. 归一化处理并绘制柱状图 考虑到原始数值可能会非常大而无法直观呈现,因此先对这些值做适当缩放;之后遍历每一个bin位置,按照对应高度填充颜色条带完成整个图表构建[^5]。 ```cpp // Normalize the result to [0, histImage.rows] normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); for (int i = 1; i < histSize; ++i) { line(histImage, Point(bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1))), Point(bin_w*i, hist_h - cvRound(hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA); } imshow("Histogram", histImage); waitKey(); ``` 上述代码片段展示了完整的流程,从准备阶段直到最后的结果输出。值得注意的是,不同应用场景下的细节设定会有所差异,比如窗口大小的选择或是色彩方案的设计都可以灵活调整以满足特定的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值