OpenCV C++绘制灰度直方图
时间: 2025-06-20 10:41:56 浏览: 17
### 使用 OpenCV 和 C++ 实现灰度图像直方图绘制
为了实现这一功能,程序通常分为几个部分:读取图像、转换为灰度模式、计算直方图以及最终绘制直方图。
#### 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 = ⦥
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();
```
上述代码片段展示了完整的流程,从准备阶段直到最后的结果输出。值得注意的是,不同应用场景下的细节设定会有所差异,比如窗口大小的选择或是色彩方案的设计都可以灵活调整以满足特定的要求。
阅读全文
相关推荐


















