web-dev-qa-db-ja.com

MATLABでFFTを使用して画像のパターンとノイズを削除する

私はclown.jpg画像を使用して、それが持っている明白なパターン/ノイズを取り除くことができるようにしています。

enter image description here

画像のFFTを取得する前に行った最初の手順は、2の累乗の正方形の画像(256 x 256など)を再スケーリングすることです。 matlabでFFTとfftshiftを使用すると、画像の中心に強度がある高速フーリエ変換が得られます。次の画像は、前述の関数を使用した結果です。

enter image description here

以下に示すように、FFT画像で手動で「星」をゼロにすることにより、パターン/ノイズを除去することに成功しました。

enter image description here

IFFTを取ると、はるかに高品質の画像が得られます(図には示されていません)。

私が持っている質問は、「スター」をゼロにする自動化された方法があるかどうかです。最も明るい「星」、DCコンポーネント、または低い値を削除したくないので、画像をゼロにする間隔を作成しました。このようなしきい値は以下のとおりです。

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) )

where fLog is the log(1+abs(Fourier image)) and .7 and .25 are the corresponding
interval percentages.

出力マスク(フーリエイメージに乗算します)は次のとおりです。黒は0の値に対応し、白は1に対応します。このマスクのフィルタリングにより、いくつかの「星」が削除され、DCコンポーネントの一部が保持されます。明らかに、この方法は最適ではありません。

enter image description here

ハイパスフィルターの実行について読んでいましたが、フーリエ画像のすべての外側の値が削除されているようです。これは、以前のテストに基づいています(これらの画像は含めていません)。

DCコンポーネント以外の高輝度値を強調表示することをお勧めします。理想的には、マスクを次のようにしたいと思います。

enter image description here

ソース: http://users.accesscomm.ca/bostrum/Imaging/tips/tip1.html

別のサイトでは、「FFTデータをハイパスおよびレベル補正して、ラスターパターンを表す浮遊ドットのみを保持する」と述べられていました。正確にそれを行う方法については不明です。

ソース: http://www.robotplanet.dk/graphics/raster_removal/

よろしくお願いいたします。

ここに私のソースコードがあります:

I = imread('clown.jpg'); % Read Image

% convert to grayscale
I = rgb2gray(I);

% normalize the image and conver to doubleI
I = double(mat2gray(I));

% Resize the image
I = imresize(I, [256 256]);

% get the size of the image
[rows,cols] = size(I);

% apply FFT
f = fftshift(fft2(I));

% used to plot the image
fLog = log(1 + abs(f));

% filter by a range based on fLog

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) );

B = abs(ifft2(f.*filter));

colormap(gray)
subplot(2,2,1),imagesc(I); title('Original Image')
subplot(2,2,2),imagesc(fLog); title('Fourier Image')
subplot(2,2,3),imagesc(filter); title('Zeroed Fourier Image')
subplot(2,2,4),imagesc(B); title('Cleaned Image')
annotation('textbox', [0 0.9 1 0.1], ...
    'String', 'Fourier Analysis on Clown Image', ...
    'EdgeColor', 'none', ...
    'HorizontalAlignment', 'center', ...
    'FontSize', 15, ...
    'FontWeight', 'bold')
16

周波数領域で極大の大きさを検出し、それらの近傍とともにゼロにしようとしました。正確にはクリーンではありませんが、少なくともある程度の自動ゼロを実現します。 enter image description here

私のコード:

I=I-mean(I(:));
f = fftshift(fft2(I));
fabs=abs(f);

roi=3;thresh=400;
local_extr = ordfilt2(fabs, roi^2, ones(roi));  % find local maximum within 3*3 range

result = (fabs == local_extr) & (fabs > thresh);

[r, c] = find(result);
for i=1:length(r)
    if (r(i)-128)^2+(c(i)-128)^2>400   % periodic noise locates in the position outside the 20-pixel-radius circle
        f(r(i)-2:r(i)+2,c(i)-2:c(i)+2)=0;  % zero the frequency components
    end
end

Inew=ifft2(fftshift(f));
imagesc(real(Inew)),colormap(gray),
3
lennon310

私は最近、宿題用のノッチフィルターを記述しました。サンプルコードを見つけるのに苦労しました。これが私のコードが役立つことを願っています。

周期的なノイズを除去するための理想的なノッチリジェクトフィルターです。

I = imread('clown.jpg'); %read image
I = imresize(I, [256 256]); %resize image
[m,n] = size(I);%get size of image as m and n
[X,Y]=meshgrid(1:256,1:256); % it is a meshgrid for circle mask
filter=ones(m,n); % filter initially only ones in it
%according to notch filter equation it will find point on image is on    imaginary circle.i found circle coordinates.
for i=1:m-1
  for j=1:n-1
  d0 = i-130)^2 + (j-130)^2 <= 32^2 && (i-130)^2 + (j-130)^2 >=20^2; 
      if d0
         filter(i,j)=0;
     else
         filter(i,j)=1;
     end
   end
 end
f = fftshift(fft2(I));
G = abs(ifft2(f.*filter));
figure(1),imshow(G,[]);
0
Murat Gümüş