我试图找出解卷积的工作原理。我理解它背后的想法,但我想了解一些实现它的实际算法 - 算法将带有点样本函数(模糊内核)的模糊图像作为输入,并产生潜像的输出。
到目前为止,我发现了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算法中的确切步骤是为了找出原始图像。
答案 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')
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);
我唯一不太了解的是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)
如果它有帮助,我写的是一个包含一些文档的实现....
Richardson Lucy是许多其他反卷积算法的构建模块。例如,上面的iocbio示例修改了算法以更好地处理噪声。
这是一个相对简单的算法(就像这些事情一样)并且是更复杂算法的起点,因此您可以找到许多不同的实现。