图像复原之Lucy-Richardson算法滤波

算法原理见:图像去卷积(二)——Richardson–Lucy算法

     算法代码来自:Deconvolution with OpenCV?

     具体原理到代码实现过程有待进一步学习,这里先验证一下算法效果。

     程序和图片打包:Lucy-Richardson算法(opencv版) stackoverflow.rar

#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
static void RLTikh_deconvolution(Mat img, Mat &result, int num_iterations);
float sigmaG = 4.0, EPSILON =0.01;
int main()
{
    Mat guassianImage= imread("E://image//guassian.jpg");
    Mat guassianImageF, resImage7, resImage21, resImage150;
    guassianImage.convertTo(guassianImageF, CV_64FC3, 1.0 / 255, 0);
 
    imshow("guassianImageF", guassianImageF);
    //GaussianBlur(originImage, guassianImage, Size(11, 11), 4, 4);
    //imwrite("E://image//guassian.jpg", guassianImage);这两句是制造由于图像复原的特定参数的高斯模糊图像,
    //现在看此算法的sigmaG和winSize参数只有和高斯模糊图像中的GaussianBlur函数参数完全对应,才能取得较好效果,此例中为4和11.
    RLTikh_deconvolution(guassianImageF, resImage7, 7);
    RLTikh_deconvolution(guassianImageF, resImage21, 21);
    RLTikh_deconvolution(guassianImageF, resImage150, 150);
    imshow("restorationImage7", resImage7);
    imshow("restorationImage21", resImage21);
    imshow("restorationImage150", resImage150);
    waitKey(0);
    return 0;
}
static void RLTikh_deconvolution(Mat img, Mat &result, int num_iterations)
{
    // Lucy-Richardson Deconvolution Function
    // input-1 img: NxM matrix image
    // input-2 num_iterations: number of iterations
    // input-3 sigma: sigma of point spread function (PSF)
    // output result: deconvolution result
 
    // Window size of PSF
    int winSize = 11;// 10 * sigmaG + 1;
 
    // Initializations
    Mat Y = img.clone();
    Mat J1 = img.clone();
    Mat J2 = img.clone();
    Mat wI = img.clone();
    Mat imR = img.clone();
    Mat reBlurred = img.clone();
 
    Mat T1, T2, tmpMat1, tmpMat2;
    T1 = Mat(img.rows, img.cols, CV_64FC3, 0.0);
    T2 = Mat(img.rows, img.cols, CV_64FC3, 0.0);
 
    // Lucy-Rich. Deconvolution CORE
 
    double lambda = 0;
    for (int j = 0; j < num_iterations; j++)
    {
        if (j > 1) {
            // calculation of lambda
            multiply(T1, T2, tmpMat1);
            multiply(T2, T2, tmpMat2);
            lambda = sum(tmpMat1)[0] / (sum(tmpMat2)[0] + EPSILON);
            // calculation of lambda
        }
 
        Y = J1 + lambda * (J1 - J2);
        Y.setTo(0, Y < 0);
 
        // 1)
        GaussianBlur(Y, reBlurred, Size(winSize, winSize), sigmaG, sigmaG);//applying Gaussian filter 
        reBlurred.setTo(EPSILON, reBlurred <= 0);
 
        // 2)
        divide(wI, reBlurred, imR);
        imR = imR + EPSILON;
 
        // 3)
        GaussianBlur(imR, imR, Size(winSize, winSize), sigmaG, sigmaG);//applying Gaussian filter 
 
        // 4)
        J2 = J1.clone();
        multiply(Y, imR, J1);
 
        T2 = T1.clone();
        T1 = J1 - Y;
    }
 
    // output
    result = J1.clone();
}
--------------------- 
作者:Coming_is_winter 
来源:CSDN 
原文:https://blog.csdn.net/coming_is_winter/article/details/92800150 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值