automatedMSRCR算法opencv c++ 实现
时间: 2024-01-27 21:03:08 浏览: 115
automatedMSRCR (Automatic Multi-Scale Retinex with Color Restoration) 算法是一种图像增强算法,它可以增强图像的对比度,保留细节和颜色。下面是使用 OpenCV C++ 实现 automatedMSRCR 算法的示例代码:
```c++
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
Mat automatedMSRCR(Mat input, float sigma_list[], int sigma_list_size, float G, float b, int alpha, int beta, int low_clip, int high_clip)
{
Mat L;
input.convertTo(L, CV_32FC1);
L = log(L + 1.0f);
Mat R;
for (int i = 0; i < sigma_list_size; i++)
{
Mat tmp;
GaussianBlur(input, tmp, Size(0, 0), sigma_list[i], sigma_list[i], BORDER_DEFAULT);
tmp.convertTo(tmp, CV_32FC1);
tmp = log(tmp + 1.0f) - L;
tmp = exp(tmp - G);
R += tmp;
}
R /= sigma_list_size;
Mat output;
output = input * (1.0f - b) + R * b;
output.convertTo(output, CV_8UC3);
std::vector<Mat> channels;
split(output, channels);
for (int i = 0; i < 3; i++)
{
channels[i] = (channels[i] - mean(channels[i])) * alpha + mean(channels[i]);
threshold(channels[i], channels[i], 0, 255, THRESH_TOZERO);
normalize(channels[i], channels[i], low_clip, high_clip, NORM_MINMAX);
}
merge(channels, output);
return output;
}
int main()
{
Mat input = imread("input.jpg");
float sigma_list[] = { 15.0f, 80.0f, 250.0f };
int sigma_list_size = sizeof(sigma_list) / sizeof(float);
float G = 5.0f;
float b = 25.0f;
int alpha = 125;
int beta = 46;
int low_clip = 0;
int high_clip = 255;
Mat output = automatedMSRCR(input, sigma_list, sigma_list_size, G, b, alpha, beta, low_clip, high_clip);
imshow("input", input);
imshow("output", output);
waitKey();
return 0;
}
```
在这个示例中,我们使用了 OpenCV 的核心模块(core)、图像 I/O 模块(highgui)和图像处理模块(imgproc)。具体来说,我们使用了以下函数:
- `imread()`:加载输入图像。
- `GaussianBlur()`:对输入图像进行高斯模糊。
- `split()`:将输出图像的三个通道分离。
- `mean()`:计算每个通道的均值。
- `threshold()`:将每个通道的像素值截断为 0 到 255 之间。
- `normalize()`:将每个通道的像素值归一化为 0 到 255 之间。
- `merge()`:将三个通道合并为一幅图像。
- `imshow()`:显示图像。
- `waitKey()`:等待用户按键。
在实现 automatedMSRCR 算法时,我们需要将输入图像转换为浮点数类型,然后进行对数变换。接着,我们使用高斯模糊对输入图像进行多尺度处理,计算出 R 通道。最后,我们将 R 通道与输入图像的原始亮度值进行加权平均,并对每个通道进行颜色修正和像素值调整,最终得到增强后的图像。