Richardson-Lucy算法如何工作?代码示例?

时间:2012-03-24 18:27:32

标签: python algorithm image-processing convolution

我试图找出解卷积的工作原理。我理解它背后的想法,但我想了解一些实现它的实际算法 - 算法将带有点样本函数(模糊内核)的模糊图像作为输入,并产生潜像的输出。

到目前为止,我发现了Richardson–Lucy算法,其中数学似乎并不那么困难,但我无法确定实际算法的工作原理。在维基百科,它说:

  

这导致了一个方程式,可以根据......

迭代解决

然而它没有显示实际的循环。任何人都可以指向我解释实际算法的资源。在Google上,我只设法找到使用Richardson-Lucy作为其中一个步骤的方法,而不是实际的Richardson-Lucy算法。

任何语言或伪代码中的算法都会很好,但如果在Python中可用,那就太棒了。

提前完成。

修改

基本上我想弄清楚的是模糊图像(nxm):

x00 x01 x02 x03 .. x0n
x10 x11 x12 x13 .. x1n
...
xm0 xm1 xm2 xm3 .. xmn

和用于获取模糊图像的内核(ixj):

p00 p01 p02 .. p0i
p10 p11 p12 .. p1i
...
pj0 pj1 pj2 .. pji

Richardson-Lucy算法中的确切步骤是为了找出原始图像。

4 个答案:

答案 0 :(得分:4)

这是一个非常简单的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); 

我唯一不太了解的是PSF的空间逆转是如何工作的以及它的用途。如果有人能为我解释那会很酷!我也正在寻找一个简单的Matlab R-L实现空间变异PSF(即空间非均匀点扩散函数) - 如果有人有一个请告诉我!

要摆脱边缘处的人工制品,您可以在边缘镜像输入图像,然后在之后裁剪掉镜像位,或者在致电image = edgetaper(image, PSF)之前使用Matlab的RL_deconv

原生Matlab实现deconvlucy.m有点复杂btw - 可以找到here的源代码并使用accelerated version of the basic algorithm

答案 1 :(得分:1)

这是一个开源的Python实现: http://code.google.com/p/iocbio/wiki/IOCBioMicroscope

答案 2 :(得分:1)

维基百科上的等式根据迭代t+1给出迭代t的函数。您可以通过以下方式实现此类迭代算法:

def iter_step(prev):
  updated_value = <function from Wikipedia>
  return updated_value

def iterate(initial_guess):
  cur = initial_guess
  while True:
    prev, cur = cur, iter_step(cur)
    if difference(prev, cur) <= tolerance:
      break
  return cur

当然,您必须实现自己的difference函数,该函数对于您正在使用的任何类型的数据都是正确的。您还需要处理从未达到收敛的情况(例如,限制迭代次数)。

答案 3 :(得分:1)

如果它有帮助,我写的是一个包含一些文档的实现....

https://github.com/bnorthan/projects/blob/master/truenorthJ/ImageJ2Plugins/functions/src/main/java/com/truenorth/functions/fft/filters/RichardsonLucyFilter.java

Richardson Lucy是许多其他反卷积算法的构建模块。例如,上面的iocbio示例修改了算法以更好地处理噪声。

这是一个相对简单的算法(就像这些事情一样)并且是更复杂算法的起点,因此您可以找到许多不同的实现。