web-dev-qa-db-ja.com

Matlabで2D FFTをプロットする方法は?

MATLABでグレースケールイメージのフーリエ変換を計算するためにfft2を使用しています。

結果の大きさをプロットする一般的な方法は何ですか?

38
Ben-Uri

Iが入力画像であり、Fがフーリエ変換であると仮定します(つまり、F = fft2(I)

次のコードを使用できます。

F = fftshift(F); % Center FFT

F = abs(F); % Get the magnitude
F = log(F+1); % Use log, for perceptual scaling, and +1 since log(0) is undefined
F = mat2gray(F); % Use mat2gray to scale the image between 0 and 1

imshow(F,[]); % Display the result
53
Ben-Uri

HOW TO Matlabページの例を次に示します。

close all; clear all;

img   = imread('lena.tif','tif');
imagesc(img)
img   = fftshift(img(:,:,2));
F     = fft2(img);

figure;

imagesc(100*log(1+abs(fftshift(F)))); colormap(gray); 
title('magnitude spectrum');

figure;
imagesc(angle(F));  colormap(gray);
title('phase spectrum');

これにより、画像の振幅スペクトルと位相スペクトルが得られます。カラー画像を使用しましたが、グレー画像も使用するように簡単に調整できます。

追伸Matlab 2012aで​​は上記の画像が含まれていないことに気付きました。したがって、上の最初の行を次のように置き換えてください。

img = imread('ngc6543a.jpg');

そしてそれは動作します。古いバージョンのMatlabを使用して上記の例を作成し、ここにコピーしました。

スケーリング係数について

2Dフーリエ変換の大きさをプロットするときは、対数変換を使用してピクセル値をスケーリングし、暗いピクセルの範囲を明るい領域に拡大する必要があります。これにより、変換がわかりやすくなります。方程式でc値を使用します

s = c log(1+r) 

私が知っているこのスケールを事前に決定する既知の方法はありません。あなたが好きになるために異なる値を試す必要があります。上記の例では100を使用しました。

enter image description here

23
Nasser