これは非常に単純な 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 はもう少し複雑です。そのソース コードはここで見つけることができ、基本アルゴリズムの高速化されたバージョンを使用します。