opencv4 C++实现直方图均衡
时间: 2023-08-31 07:10:21 浏览: 140
以下是使用OpenCV 4和C语言实现直方图均衡的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读取图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image: " << endl;
return 1;
}
// 计算直方图
Mat hist;
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);
// 计算累积直方图
Mat cumHist(histSize, 1, CV_32FC1);
cumHist.at<float>(0, 0) = hist.at<float>(0, 0);
for (int i = 1; i < histSize; i++)
{
cumHist.at<float>(i, 0) = cumHist.at<float>(i - 1, 0) + hist.at<float>(i, 0);
}
// 直方图均衡化
Mat eqImg(img.size(), img.type());
float alpha = 255.0 / (img.rows * img.cols);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
int intensity = img.at<uchar>(i, j);
eqImg.at<uchar>(i, j) = cvRound((cumHist.at<float>(intensity, 0) * alpha));
}
}
// 显示原图和均衡化后的图像
namedWindow("Original Image", WINDOW_AUTOSIZE);
imshow("Original Image", img);
namedWindow("Equalized Image", WINDOW_AUTOSIZE);
imshow("Equalized Image", eqImg);
waitKey(0);
return 0;
}
```
该程序中,我们首先读取了一张灰度图像,并计算了其直方图。然后,我们使用累积直方图将图像进行直方图均衡化,并显示了原始图像和均衡化后的图像。在计算累积直方图时,我们使用了一个简单的迭代方法,即将当前像素的灰度级与前一个像素的灰度级相加,以便在每个灰度级上获得其累积值。最后,我们使用cvRound函数将每个像素的值四舍五入到最接近的整数,以便将其转换为8位无符号整数。
阅读全文
相关推荐















