在opencv中用C++语言对图像进行灰度均匀化处理,并输出灰度直方图
时间: 2024-12-06 14:21:57 浏览: 123
在OpenCV(开源计算机视觉库)中,使用C++对图像进行灰度均匀化处理通常涉及两个步骤:首先将彩色图像转换为灰度图像,然后应用直方图均衡化技术。
1. **转换为灰度图像**:
```cpp
#include <opencv2/opencv.hpp>
cv::Mat src; // 假设src是输入的彩色图像
cv::Mat grayImage;
if (src.channels() > 1) { // 如果是BGR三通道
cv::cvtColor(src, grayImage, cv::COLOR_BGR2GRAY); // 转换为灰度
} else {
grayImage = src; // 如果已经是灰度图像,则无需转换
}
```
2. **灰度直方图均衡化**:
```cpp
cv::Mat eqImage;
cv::equalizeHist(grayImage, eqImage); // 应用直方图均衡化
eqImage.copyTo(grayImage); // 将结果保存回grayImage矩阵,因为原地操作更高效
```
3. **输出灰度直方图**:
```cpp
cv::Mat hist(256, 1, CV_32SC1);
cv::calcHist(&grayImage, 1, nullptr, hist, {0}, {256});
std::vector<cv::Vec3b> colors(256, cv::Vec3b(0, 0, 255)); // 创建用于绘制颜色条的颜色向量
cv::normalize(hist, hist, 0, 255, cv::NORM_MINMAX);
// 绘制直方图
cv::namedWindow("Gray Histogram", cv::WINDOW_NORMAL);
cv::createTrackbar("Bin Size", "Gray Histogram", 1, hist.cols, [](int pos) { });
for (size_t i = 0; i < hist.rows; ++i) {
double value = static_cast<double>(hist.at<int>(i)[0]) / hist.total();
cv::rectangle(colors, cv::Point(i, int(value * 255)), cv::Point(i + 1, int((value + 0.005) * 255)), cv::Scalar(0), -1);
}
cv::imshow("Gray Histogram", colors);
cv::waitKey();
```
完成上述步骤后,你就实现了图像的灰度均匀化并显示了灰度直方图。
阅读全文
相关推荐
















