msrcr图像增强算法opencv 实现
时间: 2024-01-20 10:03:20 浏览: 29
MSRCR(Multi-Scale Retinex with Color Restoration)是一种用于图像增强的算法,可以使图像的亮度、对比度和饱和度得到更好的改善。下面是使用OpenCV实现MSRCR算法的步骤:
1. 读取图像并转换为Lab色彩空间。
```c++
Mat image = imread("image.jpg");
Mat labImage;
cvtColor(image, labImage, COLOR_BGR2Lab);
```
2. 对Lab图像进行多尺度Retinex处理。
```c++
Mat msrImage;
vector<Mat> labChannels;
split(labImage, labChannels);
for (int i = 0; i < labImage.channels(); i++) {
Mat channel = labChannels[i];
Mat logChannel;
log(channel + 1, logChannel);
for (int sigma = 1; sigma < 10; sigma += 2) {
Mat blurred;
GaussianBlur(logChannel, blurred, Size(sigma, sigma), 0);
Mat diff;
subtract(logChannel, blurred, diff);
Mat scaled;
divide(diff, (sigma * sigma), scaled);
add(msrImage, scaled, msrImage);
}
}
```
3. 对多尺度Retinex处理后的图像进行颜色恢复。
```c++
Mat restoredImage;
for (int i = 0; i < labImage.channels(); i++) {
Mat channel = labChannels[i];
Mat expChannel;
exp(msrImage - Scalar::all(1), expChannel);
Mat restoredChannel;
divide(channel, expChannel, restoredChannel);
restoredImage.push_back(restoredChannel);
}
Mat enhancedImage;
cvtColor(restoredImage, enhancedImage, COLOR_Lab2BGR);
```
4. 显示增强后的图像。
```c++
imshow("Enhanced Image", enhancedImage);
waitKey(0);
```
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat image = imread("image.jpg");
Mat labImage;
cvtColor(image, labImage, COLOR_BGR2Lab);
Mat msrImage = Mat::zeros(labImage.size(), CV_32F);
vector<Mat> labChannels;
split(labImage, labChannels);
for (int i = 0; i < labImage.channels(); i++) {
Mat channel = labChannels[i];
Mat logChannel;
log(channel + 1, logChannel);
for (int sigma = 1; sigma < 10; sigma += 2) {
Mat blurred;
GaussianBlur(logChannel, blurred, Size(sigma, sigma), 0);
Mat diff;
subtract(logChannel, blurred, diff);
Mat scaled;
divide(diff, (sigma * sigma), scaled);
add(msrImage, scaled, msrImage);
}
}
Mat restoredImage = Mat::zeros(labImage.size(), CV_32F);
for (int i = 0; i < labImage.channels(); i++) {
Mat channel = labChannels[i];
Mat expChannel;
exp(msrImage - Scalar::all(1), expChannel);
Mat restoredChannel;
divide(channel, expChannel, restoredChannel);
restoredImage.push_back(restoredChannel);
}
Mat enhancedImage;
cvtColor(restoredImage, enhancedImage, COLOR_Lab2BGR);
imshow("Enhanced Image", enhancedImage);
waitKey(0);
return 0;
}
```