5

デコンボリューションがどのように機能するかを理解しようとしています。私はその背後にある考え方を理解していますが、それを実装する実際のアルゴリズムのいくつかを理解したいと思っています.ポイントサンプル関数(ぼかしカーネル)を使用してぼやけた画像を入力として受け取り、出力として潜像を生成するアルゴリズムです。

これまでのところ、数学はそれほど難しくないように見えるRichardson-Lucyアルゴリズムを見つけましたが、実際のアルゴリズムがどのように機能するかはわかりません。ウィキペディアには次のように書かれています。

これにより、反復的に解くことができる方程式が得られます...

ただし、実際のループは表示されません。実際のアルゴリズムが説明されているリソースを教えてください。Google では、Richardson-Lucy をステップの 1 つとして使用するメソッドのみを見つけることができましたが、実際の 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

元の画像を理解するためのリチャードソン・ルーシー アルゴリズムの正確な手順は何ですか?

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

ウィキペディアの方程式は、反復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

ここで役立つ場合は、いくつかのドキュメントを含む私が書いた実装です....

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 に答える
1

オープン ソースの Python 実装は次のとおりです: http://code.google.com/p/iocbio/wiki/IOCBioMicroscope

于 2012-03-24T19:26:49.767 に答える