您的位置:首页 > 运维架构

带色彩恢复信息的多尺度视网膜增强算法(MSRCR)

2016-12-27 22:29 597 查看
原理可以参考该博客

http://www.cnblogs.com/Imageshop/archive/2013/04/17/3026881.html

按照博客的思路用opencv先实现(MSR).

截取了博客的图像





#include <opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
#pragma comment(lib, "opencv_highgui2410d")
#pragma comment(lib, "opencv_core2410d")
#pragma comment(lib, "opencv_imgproc2410d")
const int R = 10;
const double CR = 0.299;
const double CG = 0.587;
const double CB = 0.114;
const double EPS = 1e-4;
const int SCALE[] = {11, 101, 201};//尺度选择
void Msr(const Mat& inputArray)
{
vector<Mat> RGB;
split(inputArray, RGB);
double max, min;
Mat I(inputArray.size(), CV_32F);
Mat lgI(inputArray.size(), CV_32F);
Mat lgR = Mat::zeros(inputArray.size(), CV_32F);
Mat lgL(inputArray.size(), CV_32F);
Mat gain(inputArray.size(), CV_32F);
Mat R(inputArray.size(), CV_32F);
Mat outputArray(inputArray.size(), CV_32FC3);

I = CR * RGB[2] + CG * RGB[1] + CB * RGB[0] + EPS;
log(I, lgI);
for(int i = 0; i < 3; ++i){
GaussianBlur(lgI, lgL, Size(SCALE[i], SCALE[i]), SCALE[i] / 3);//Gaussian权重矩阵大小要奇数
lgR += (lgI - lgL);
}
lgR /= 3;
minMaxIdx(lgR, &min, &max);
R = ((lgR - min) / (max - min)) * 255;
divide(R, I, gain);
multiply(RGB[0], gain, RGB[0]);
multiply(RGB[1], gain, RGB[1]);
multiply(RGB[2], gain, RGB[2]);

merge(RGB, outputArray);

outputArray.convertTo(outputArray, CV_8UC3);
imshow("MSR", outputArray);
}
void imageTest()
{
string name = "C:/Users/Zack.J/Desktop/图像处理/image/4.bmp";
Mat inputArray = imread(name);
assert(inputArray.rows > 0);
imshow("Ori", inputArray);
inputArray.convertTo(inputArray, CV_32FC3);
Msr(inputArray);
char ch = waitKey(0);
if(ch == 27)
return;
}
int main()
{
imageTest();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv
相关文章推荐