opencv中绘制直方图效果图
时间: 2024-10-10 19:15:02 浏览: 34
在OpenCV(Open Source Computer Vision Library)中,绘制直方图是一种常见的图像处理操作,用于分析图像的颜色或灰度分布。以下是如何使用OpenCV创建并显示直方图的基本步骤:
1. **读取图像**:
使用`cv::imread`函数读取图像。
```cpp
cv::Mat image = cv::imread("image.jpg");
```
2. **获取像素数据**:
对于颜色图像,如BGR,你可以分别提取每个通道(蓝色、绿色、红色)的数据。
```cpp
cv::Mat bgrChannels[3];
cv::split(image, bgrChannels);
cv::Mat grayImage;
cv::cvtColor(bgrChannels[0], grayImage, cv::COLOR_BGR2GRAY); // 如果只对灰度图像感兴趣
```
3. **计算直方图**:
使用`cv::calcHist`函数计算直方图。这里假设我们已经有了灰度图像。
```cpp
std::vector<cv::Mat> channels(1, grayImage);
int histSize[] = {256}; // 历史大小,这里是256个灰度级
float range[] = {0, 256};
const float* ranges[] = {range};
cv::Mat hist;
cv::calcHist(&channels, 1, 0, Mat(), hist, 1, histSize, ranges);
```
4. **绘制直方图**:
使用`cv::imshow`和`cv::drawHist`函数显示直方图。
```cpp
cv::namedWindow("Histogram", cv::WINDOW_NORMAL);
cv::resizeWindow("Histogram", 800, 400); // 可调整窗口大小
cv::drawHist(hist, 0, 0, "Histogram");
cv::imshow("Histogram", hist);
```
5. **等待按键**:
用`cv::waitKey`暂停程序直到用户按下任意键。
```cpp
cv::waitKey(0);
```
完整代码示例:
```cpp
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
if (argc != 2) {
std::cout << "Usage: ./program image_file" << std::endl;
return -1;
}
cv::Mat image = cv::imread(argv[1]);
cv::Mat grayImage;
// ... (步骤2-3)
std::vector<cv::Mat> channels(1, grayImage);
int histSize[] = {256};
float range[] = {0, 256};
const float* ranges[] = {range};
cv::Mat hist;
cv::calcHist(&channels, 1, 0, Mat(), hist, 1, histSize, ranges);
cv::namedWindow("Histogram", cv::WINDOW_NORMAL);
cv::resizeWindow("Histogram", 800, 400);
cv::drawHist(hist, 0, 0, "Histogram");
cv::imshow("Histogram", hist);
cv::waitKey(0);
return 0;
}
```
阅读全文