MSRCR opencv实现c++
时间: 2023-09-12 09:10:17 浏览: 150
testcirle.rar_c++检测圆
MSRCR(多尺度反射率恢复)是一种图像增强算法,可以提高图像的对比度和清晰度。下面是使用OpenCV实现MSRCR算法的C代码示例:
```c
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void MSRCR(Mat& src, Mat& dst, vector<double> sigma_list, vector<double> G, double beta, double alpha);
int main()
{
// 读取原始图像
Mat img = imread("lena.jpg", IMREAD_COLOR);
if (img.empty())
{
cout << "Failed to read image!" << endl;
return -1;
}
// 参数设置
vector<double> sigma_list = { 15, 80, 250 };
vector<double> G = { 5, 10, 2 };
double beta = 46;
double alpha = 125;
// MSRCR增强
Mat result;
MSRCR(img, result, sigma_list, G, beta, alpha);
// 显示结果
imshow("Original", img);
imshow("MSRCR", result);
waitKey(0);
return 0;
}
void MSRCR(Mat& src, Mat& dst, vector<double> sigma_list, vector<double> G, double beta, double alpha)
{
// 灰度化
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// 归一化
Mat img_float;
gray.convertTo(img_float, CV_64F, 1.0 / 255.0);
// 多尺度处理
vector<Mat> scales(sigma_list.size());
for (int i = 0; i < sigma_list.size(); i++)
{
double sigma = sigma_list[i];
int ksize = 2 * (int)(sigma * 3) + 1;
Mat blurred;
GaussianBlur(img_float, blurred, Size(ksize, ksize), sigma);
Mat detail = img_float - blurred;
Mat scale;
pow(blurred, G[i], scale);
scale = scale * beta / pow(sigma, alpha);
scales[i] = scale.mul(detail) + blurred;
}
// 合并
dst = Mat::zeros(src.size(), src.type());
for (int i = 0; i < scales.size(); i++)
{
Mat scale;
scales[i].convertTo(scale, CV_8U, 255.0);
dst += scale;
}
dst /= scales.size();
}
```
在上面的示例中,我们首先读取一张图像,然后设置MSRCR算法的参数。接下来,我们调用`MSRCR`函数对图像进行增强,最后显示增强后的图像。
`MSRCR`函数的实现过程如下:
1. 将原始图像灰度化并归一化到[0,1]范围内。
2. 对归一化后的图像进行多尺度处理,得到多个尺度的增强结果。具体来说,对于每个尺度,我们首先对图像进行高斯模糊,然后计算出模糊图像的幂次方,得到尺度权重。接着,我们将尺度权重乘以一个常数beta,并除以sigma的幂次方alpha,得到尺度增强系数。最后,我们将尺度增强系数乘以细节图像,再加上模糊图像,得到尺度增强结果。
3. 将多个尺度的增强结果合并,得到最终的增强结果。
注意,在上面的示例中,我们使用了`vector`来存储sigma和G的值。这是因为MSRCR算法中的尺度和幂次方参数不是固定的,可以根据具体情况进行调整。
阅读全文