我正在研究反褶皱,
偶然发现Richardson-Lucy deconvolution,
我正在考虑编写一个简单的程序来使用这种方法进行后处理,
有谁知道我在哪里可以找到完整的可实现的算法或源代码,我可以研究和使用?
最好用C ++语言或matlab。
我读了几本书,但它们有点普遍而且太理论化了。
谢谢,查尔斯·莫比 但我仍然在寻找在线.m文件时遇到问题,答案 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')
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
。
原生Matlab实现deconvlucy.m有点复杂btw - 可以找到here的源代码并使用accelerated version of the basic algorithm。