基于opencv用c++实现直方图均衡化以加强图像的代码
时间: 2024-12-29 20:33:48 浏览: 26
当然可以。在OpenCV(计算机视觉库)中,直方图均衡化是一种增强图像对比度的方法。以下是使用C++实现直方图均衡化的简单示例:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
cv::Mat histogramEqualization(const cv::Mat& src) {
// 创建一个和输入图像同样大小的灰度图像
cv::Mat dst = src.clone();
// 转换到灰度图像,因为直方图均衡化通常应用于单通道的图像
cv::cvtColor(dst, dst, cv::COLOR_BGR2GRAY);
// 计算直方图
int histSize = 256;
float range[] = {0, 256};
const float* histRange = {range};
bool uniform = true, accumulate = false;
cv::Mat hist;
cv::calcHist(&dst, 1, 0, cv::Mat(), hist, 1, &histSize, histRange, uniform, accumulate);
// 直方图均衡化
cv::Mat newHist;
double maxVal = *std::max_element(hist.data, hist.data + histSize);
for (int i = 0; i < histSize; ++i)
newHist.at<double>(i) = (double)i * hist.at<float>(i) / (src.rows * src.cols);
// 反向累积求得累计分布函数
for (int i = 1; i < histSize; ++i)
newHist.at<double>(i) += newHist.at<double>(i - 1);
// 通过查找表得到像素的新值
for (int y = 0; y < dst.rows; ++y) {
for (int x = 0; x < dst.cols; ++x) {
uchar val = dst.at<uchar>(y, x);
dst.at<uchar>(y, x) = (uchar)(newHist[val]);
}
}
return dst;
}
int main() {
// 加载图像
cv::Mat img = cv::imread("path_to_your_image.jpg", cv::IMREAD_GRAYSCALE);
if (!img.data) {
std::cout << "Error loading image." << std::endl;
return -1;
}
// 应用直方图均衡化
cv::Mat eq_img = histogramEqualization(img);
// 显示原图和处理后的图片
cv::imshow("Original Image", img);
cv::imshow("Histogram Equalized Image", eq_img);
cv::waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取一张图像,然后将其转换为灰度。接着计算直方图并应用直方图均衡化算法,最后显示原始图像和处理后的图像。
阅读全文