2

我正在研究反卷积,
偶然发现了Richardson-Lucy 反卷积
我正在考虑编写一个简单的程序来使用这种方法进行后处理,
有人知道我在哪里可以找到完整的可实现算法或源代码,我可以学习和玩耍和?

最好用C++语言或matlab。

我读过几本书,但它们有点笼统,太​​理论化了。

谢谢,查尔斯·莫比。
但我在网上查找 .m 文件时仍然遇到问题,
我得到的只是参考形式,参考不是​​真实文件。
如果您能提供更多详细信息,我们将不胜感激。
提前致谢!

4

4 回答 4

5

MATLAB 有一个不错的实现(在 Google 上搜索 corelucy.m 和 deconvlucy.m,或下载 MATLAB 和图像处理工具箱演示)。

MathWorks 在其网站上有文档:

http://www.mathworks.com/access/helpdesk/help/toolbox/images/bqqhld4.html

外循环(设置反卷积点扩散函数,进行迭代)在这里:
http ://ecco2.jpl.nasa.gov/opendap/hyrax/matlab/images/images/deconvlucy.m

内循环(LR算法的核心部分):
https ://svn.ecdf.ed.ac.uk/repo/ph/IGM/matlab/generic/images/corelucy.m

非常感谢 NASA 托管 MATLAB 的一部分!

于 2009-04-14T14:55:25.157 回答
1

我建议使用MATLAB或 F/OSS 替代GNU Octave。它们对于这类事情要好得多,因为它们有图像处理例程库,而卷积是一个经过高度优化的内置函数。

于 2009-04-14T14:51:48.583 回答
0

如果要使用 MATLAB 图像处理工具箱 ( DECONVLUCY ) 自带的 Richardson-Lucy 反卷积算法,需要先获取图像处理工具箱 =)。在我为 SO question 给出的另一个答案中,我提到了如何试用 MATLAB 及其各种工具箱(如果您还没有的话)。获得工具箱后,您可能可以查看 DECONVLUCY 的源代码(.m 或 .c 文件)来研究算法并弄清楚它是如何工作的。

于 2009-04-17T21:54:25.527 回答
0

这是 Richardson-Lucy 反卷积的一个非常简单的 Matlab 实现:

function result = RL_deconv(image, PSF, iterations)
    % to utilise the conv2 function we must make sure the inputs are double
    image = double(image);
    PSF = double(PSF);
    latent_est = image; % initial estimate, or 0.5*ones(size(image)); 
    PSF_HAT = PSF(end:-1:1,end:-1:1); % spatially reversed psf
    % iterate towards ML estimate for the latent image
    for i= 1:iterations
        est_conv      = conv2(latent_est,PSF,'same');
        relative_blur = image./est_conv;
        error_est     = conv2(relative_blur,PSF_HAT,'same'); 
        latent_est    = latent_est.* error_est;
    end
    result = latent_est;

original = im2double(imread('lena256.png'));
figure; imshow(original); title('Original Image')

在此处输入图像描述

hsize=[9 9]; sigma=1;
PSF = fspecial('gaussian', hsize, sigma);
blr = imfilter(original, PSF);
figure; imshow(blr); title('Blurred Image')

在此处输入图像描述

res_RL = RL_deconv(blr, PSF, 1000); toc;
figure; imshow(res_RL2); title('Recovered Image')

在此处输入图像描述

您也可以在频域中工作,而不是像上面那样在空间域中工作。在这种情况下,代码将是:

function result = RL_deconv(image, PSF, iterations)
fn = image; % at the first iteration
OTF = psf2otf(PSF,size(image)); 
for i=1:iterations
    ffn = fft2(fn); 
    Hfn = OTF.*ffn; 
    iHfn = ifft2(Hfn); 
    ratio = image./iHfn; 
    iratio = fft2(ratio); 
    res = OTF .* iratio; 
    ires = ifft2(res); 
    fn = ires.*fn; 
end
result = abs(fn); 

要消除边缘的伪影,您可以在边缘镜像输入图像,然后裁剪掉镜像位,或者image = edgetaper(image, PSF)在调用之前使用 Matlab 的RL_deconv

本地 Matlab 实现 deconvlucy.m 稍微复杂一点 - 可以在此处找到源代码,并使用基本算法的加速版本

于 2017-09-30T21:45:57.633 回答