图像自动色阶算法C++
时间: 2023-10-12 21:20:17 浏览: 49
图像自动色阶算法是一种常见的图像处理算法,可以自动调整图像的亮度和对比度,使图像看起来更加清晰和鲜明。下面是一个简单的 C++ 实现:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
if (argc != 2)
{
cout << "Usage: ./auto_levels <image_path>" << endl;
return -1;
}
Mat image = imread(argv[1]);
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
Mat hsv_image;
cvtColor(image, hsv_image, COLOR_BGR2HSV);
vector<Mat> hsv_channels;
split(hsv_image, hsv_channels);
// 计算直方图
int hist_size = 256;
float range[] = { 0, 256 };
const float* hist_range = { range };
Mat hist;
calcHist(&hsv_channels[2], 1, 0, Mat(), hist, 1, &hist_size, &hist_range, true, false);
// 计算积分直方图
Mat cum_hist = hist.clone();
for (int i = 1; i < hist_size; i++)
{
cum_hist.at<float>(i) += cum_hist.at<float>(i - 1);
}
// 计算最小和最大灰度级
float min_value = cum_hist.at<float>(0);
float max_value = cum_hist.at<float>(hist_size - 1);
float alpha = 255.0 / (max_value - min_value);
// 调整亮度和对比度
Mat lut(1, hist_size, CV_8U);
for (int i = 0; i < hist_size; i++)
{
float value = (cum_hist.at<float>(i) - min_value) * alpha;
value = max(0.0f, min(value, 255.0f));
lut.at<uchar>(i) = static_cast<uchar>(value);
}
Mat equalized_image;
LUT(hsv_channels[2], lut, equalized_image);
hsv_channels[2] = equalized_image;
Mat equalized_hsv_image;
merge(hsv_channels, equalized_hsv_image);
Mat result_image;
cvtColor(equalized_hsv_image, result_image, COLOR_HSV2BGR);
imshow("Original Image", image);
imshow("Equalized Image", result_image);
waitKey(0);
return 0;
}
```
这个实现使用了 OpenCV 库,首先将输入图像转换为 HSV 颜色空间,然后计算亮度通道的直方图和积分直方图,调整亮度和对比度,最后将调整后的亮度通道与其他通道合并,将结果转换回 BGR 颜色空间并显示。