我正在研究反卷积,
偶然发现了Richardson-Lucy 反卷积,
我正在考虑编写一个简单的程序来使用这种方法进行后处理,
有人知道我在哪里可以找到完整的可实现算法或源代码,我可以学习和玩耍和?
最好用C++语言或matlab。
我读过几本书,但它们有点笼统,太理论化了。
谢谢,查尔斯·莫比。
但我在网上查找 .m 文件时仍然遇到问题,
我得到的只是参考形式,参考不是真实文件。
如果您能提供更多详细信息,我们将不胜感激。
提前致谢!
我正在研究反卷积,
偶然发现了Richardson-Lucy 反卷积,
我正在考虑编写一个简单的程序来使用这种方法进行后处理,
有人知道我在哪里可以找到完整的可实现算法或源代码,我可以学习和玩耍和?
最好用C++语言或matlab。
我读过几本书,但它们有点笼统,太理论化了。
谢谢,查尔斯·莫比。
但我在网上查找 .m 文件时仍然遇到问题,
我得到的只是参考形式,参考不是真实文件。
如果您能提供更多详细信息,我们将不胜感激。
提前致谢!
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 的一部分!
我建议使用MATLAB或 F/OSS 替代GNU Octave。它们对于这类事情要好得多,因为它们有图像处理例程库,而卷积是一个经过高度优化的内置函数。
如果要使用 MATLAB 图像处理工具箱 ( DECONVLUCY ) 自带的 Richardson-Lucy 反卷积算法,需要先获取图像处理工具箱 =)。在我为 SO question 给出的另一个答案中,我提到了如何试用 MATLAB 及其各种工具箱(如果您还没有的话)。获得工具箱后,您可能可以查看 DECONVLUCY 的源代码(.m 或 .c 文件)来研究算法并弄清楚它是如何工作的。
这是 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
。