5

我试图弄清楚反卷积是如何工作的。我理解它背后的想法,但我想了解一些实现它的实际算法 - 将模糊图像及其点采样函数(模糊内核)作为输入并产生潜在图像作为输出的算法。

到目前为止,我发现Richardson-Lucy算法的数学似乎并不那么困难,但我无法弄清楚实际算法是如何工作的。在维基百科它说:

这导致了一个方程,可以根据...迭代求解

但是它没有显示实际的循环。谁能指出我解释实际算法的资源。在谷歌上,我只能找到使用 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

4 回答 4

7

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

唯一我不太明白的是 PSF 的这种空间反转是如何工作的以及它的用途。如果有人可以为我解释那将是很酷的!我还在寻找一种用于空间变体 PSF(即空间非齐次点扩散函数)的简单 Matlab RL 实现——如果有人想要,请告诉我!

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

顺便说一句,原生 Matlab 实现 deconvlucy.m 有点复杂 - 可以在此处找到该源代码,并使用基本算法的加速版本

于 2016-02-07T21:13:29.927 回答
2

Wikipedia 上的方程根据迭代给出了迭代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函数,该函数对于您正在使用的任何类型的数据都是正确的。您还需要处理从未达到收敛的情况(例如限制迭代次数)。

于 2012-07-19T00:34:17.677 回答
1

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

于 2012-03-24T19:26:49.767 回答
1

如果这里有帮助的话,我写的一个实现包括一些文档......

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

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

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

于 2013-07-29T12:15:42.337 回答