图像直方图均衡化 c++ 原理实现
时间: 2023-11-24 13:05:24 浏览: 97
图像直方图均衡化是一种用于增强图像对比度的技术,它通过对图像的像素值进行调整,使得图像中的亮度分布更均匀。下面是一个简单的C++实现原理:
1. 首先,计算图像的灰度直方图,即统计每个灰度级别的像素数量。
2. 根据直方图,计算每个灰度级别的累积分布函数(CDF),表示灰度级别小于等于当前级别的像素所占的比例。
3. 根据CDF,计算每个灰度级别的映射表,将原始图像的每个像素值映射到新的像素值上。映射表的计算公式为:
new_value = round((L-1) * CDF(old_value))
其中,L表示灰度级别的数量,CDF(old_value)表示旧像素值对应的累积分布函数值。
4. 遍历原始图像的每个像素,根据映射表将其像素值替换为新的像素值。
下面是一个简单的示例代码:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void histogramEqualization(Mat& image) {
// 计算直方图
Mat hist;
int histSize = 256;
float range[] = {0, 256};
const float* histRange = {range};
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);
// 计算累积分布函数
Mat cdf;
hist.copyTo(cdf);
for (int i = 1; i < histSize; i++) {
cdf.at<float>(i) += cdf.at<float>(i - 1);
}
cdf /= image.total();
// 计算映射表
Mat lut(1, histSize, CV_8UC1);
for (int i = 0; i < histSize; i++) {
lut.at<uchar>(i) = saturate_cast<uchar>((histSize - 1) * cdf.at<float>(i));
}
// 应用映射表
LUT(image, lut, image);
}
int main() {
// 读取图像
Mat image = imread("input.jpg", IMREAD_GRAYSCALE);
if (image.empty()) {
cout << "Failed to read image" << endl;
return -1;
}
// 直方图均衡化
histogramEqualization(image);
// 显示结果
imshow("Equalized Image", image);
waitKey(0);
return 0;
}
```
请注意,这只是一个简单的示例代码,实际应用中可能需要处理更多的细节,例如处理彩色图像、处理边界情况等。
阅读全文