opencv直方图均衡化C++
时间: 2023-09-01 10:11:48 浏览: 115
++实现
OpenCV中的直方图均衡化可以通过equalizeHist()函数来实现。具体实现步骤如下:
1. 读入图像并转换为灰度图像。
2. 计算灰度图像的直方图。
3. 计算累积直方图,并将其归一化。
4. 计算灰度映射表。
5. 使用灰度映射表对灰度图像进行均衡化。
6. 显示原图和均衡化后的图像。
代码如下:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读入图像
Mat src = imread("lena.jpg", IMREAD_GRAYSCALE);
if (src.empty())
{
cout << "Could not open or find the image!\n" << endl;
return -1;
}
// 计算直方图
Mat hist;
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
calcHist(&src, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);
// 计算累积直方图
Mat cumHist = hist.clone();
for (int i = 1; i < histSize; i++)
{
cumHist.at<float>(i) += cumHist.at<float>(i - 1);
}
// 归一化累积直方图
cumHist /= (src.rows * src.cols);
// 计算灰度映射表
Mat lut(1, 256, CV_8UC1);
for (int i = 0; i < 256; i++)
{
lut.at<uchar>(i) = saturate_cast<uchar>(cumHist.at<float>(i) * 255.0f);
}
// 均衡化图像
Mat dst;
LUT(src, lut, dst);
// 显示原图和均衡化后的图像
namedWindow("Original Image", WINDOW_AUTOSIZE);
imshow("Original Image", src);
namedWindow("Equalized Image", WINDOW_AUTOSIZE);
imshow("Equalized Image", dst);
waitKey(0);
return 0;
}
```
阅读全文