盲解卷积算法问题

时间:2009-04-14 14:46:44

标签: c++ optimization graphics image-processing image-manipulation

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

最好用C ++语言或matlab。

我读了几本书,但它们有点普遍而且太理论化了。

谢谢,查尔斯·莫比 但我仍然在寻找在线.m文件时遇到问题,
所有我得到的参考形式是参考而不是真实的文件 如果您能提供更多详细信息,我们非常感谢 提前谢谢!

4 个答案:

答案 0 :(得分: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!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果要使用MATLAB图像处理工具箱(DECONVLUCY)中的Richardson-Lucy反卷积算法,则需要先获取图像处理工具箱=)。在another answer I gave for an SO question中,我提到了如何获得MATLAB及其各种工具箱的试验,如果你还没有它们的话。获得工具箱后,您可能会查看DECONVLUCY的源代码(.m或.c文件)来研究算法并弄清楚它是如何工作的。

答案 3 :(得分: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')

enter image description here

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

enter image description here

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

enter image description here

您也可以在频域中工作,而不是如上所述在空间域中工作。在这种情况下,代码将是:

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有点复杂btw - 可以找到here的源代码并使用accelerated version of the basic algorithm