web-dev-qa-db-ja.com

フーリエ変換を使用して画像から周期的なノイズを除去する

特定の画像に対して2DFFTを実行していて、そのスペクトル成分を取得しています。これで、この画像が別の画像と重ね合わされて、周期的なノイズが生成されました。

元の画像と周期的なノイズバージョンを以下に示します。

元の画像

enter image description here

周期的なノイズ画像

enter image description here

これを除外するために、以下に示すように、他のコンポーネントと比較して非常に大きいマグニチュードスペクトルのコンポーネントをマスクする手動ボックスを使用しました。

enter image description here

これが行われた後、逆FFTを実行しますが、元の画像を取り戻すことができません。

enter image description here

誰かが私が間違っていることを知っていますか?

値をマスクしてから、マスクされたスペクトル画像に対して逆2DFFTを実行するコードを次に示します。

pat1 = imread('Pattern1.png');

spec_orig = fft2(double(pat1));     
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2);

for j = 115:125
    for n = 96:106
        spec_img(n,j) = 0; 
    end
    for n = 216:226
        spec_img(n,j) = 0; 
    end
    for n = 274:284
        spec_img(n,j) = 0; 
    end
    for n = 298:308
        spec_img(n,j) = 0; 
    end
    for n = 12:22
        spec_img(n,j) = 0; 
    end
    for n = 37:47
        spec_img(n,j) = 0; 
    end
end

%Getting Back the Image for Pattern1
figure;subplot(2,1,1);
spec_img = log(1 + spec_img);
imshow(spec_img,[]); 

subplot(2,1,2);
ptnfx = ifft2(spec_img);
imshow(ptnfx);
8

周波数領域でのフィルタリングは、正しく行うのが難しいビジネスです。コードにいくつかのエラーがあり、元の画像を再構築できません。

  1. フィルタリングを適用していますマグニチュードコンポーネントのみ。マグニチュード成分だけでなく、元の画像スペクトルでこれを行う必要があります。このフェーズは、適切な再構築に不可欠です。ところで、信号処理用語を作成するために実装しているのは、 ノッチフィルター または特定の選択周波数を除去するバンドストップフィルターです。

  2. fftshiftを介してスペクトルを中央に配置しましたが、フィルタリングした後シフトを元に戻すのを忘れました。センタリングを元に戻すには、結果のフィルタリングされた画像でifftshiftを呼び出す必要があります。

  3. log-transformed画像の逆FFTを見つけています。スペクトルの対数変換の実行は表示の目的でのみ行われることに注意してください。あなたしないこれをフィルタリングまたは逆を見つけるときに使用します。これを行うと、非線形操作のためにスペクトルの大部分が変更されたため、意図しない結果が生じます。元の画像スペクトル自体でそれを行う必要があります。

  4. マイナーな注意ですが、逆FFTを実行した後、結果をフィルタリングした後は、必ずrealを呼び出してください。計算浮動小数点エラーが原因である可能性が高いいくつかの仮想コンポーネントが残っているため、realを呼び出すと、信号の実際のコンポーネントのみが抽出されます。

これらの修正により、これは私が持っているコードです。再現可能にするために、StackOverflowから直接画像を読み取りました。

pat1 = imread('http://i.stack.imgur.com/oIumJ.png');

%// Change
spec_orig = fft2(double(pat1)); 
spec_img = fftshift(spec_orig);

for j = 115:125
    for n = 96:106
        spec_img(n,j) = 0; 
    end
    for n = 216:226
        spec_img(n,j) = 0; 
    end
    for n = 274:284
        spec_img(n,j) = 0; 
    end
    for n = 298:308
        spec_img(n,j) = 0; 
    end
    for n = 12:22
        spec_img(n,j) = 0; 
    end
    for n = 37:47
        spec_img(n,j) = 0; 
    end
end

%// Change
ptnfx = real(ifft2(ifftshift(spec_img)));
imshow(ptnfx,[]);

私はこの画像を取得します:

enter image description here

追加する元の画像のかなり良い再構成。まだ少し筋が見られますが、それはノッチフィルターの形状とサイズに大きく依存します。おそらくサイズを大きくし、さらに大きくする場合は、ノッチフィルターの形状を正方形ではなく円形にします。正方形の角によって導入されたハードエッジには意図しないリンギング効果があるため、これは元の画像をより多く保持する傾向があります。