画像の周波数領域におけるフィルタ処理

135 ビュー (過去 30 日間)
朋貴 熊田
朋貴 熊田 2021 年 7 月 29 日
コメント済み: 朋貴 熊田 2021 年 8 月 2 日
画像をフーリエ変換して表示する所までは出来ました。しかし、そこからマスク処理を行い逆変換をし、ハイパスなりローパスなりのフィルタ処理を行う方法が分かりませんご教授お願い致します。
img=imread('C:/SNR/slow40s_same.bmp');
imshow(img)
FFT=fft2(img);
Fimg=figure;imshow(log(abs(fftshift(FFT))),[])

採用された回答

Naoya
Naoya 2021 年 8 月 2 日
下記のようなスクリプトのフローで実現できると思います。
% 画像の読み込み (256x256)
I = imread('cameraman.tif');
% 画像に対してFFT
J = fft2(I); %画像に対して 2次元FFT (周波数領域 0 ~ 2*pi)
J = fftshift(J); % 周波数領域を-pi~piとする (DCを中央にする)
figure(1);
imagesc(20*log10(abs(J))) % 画像の振幅スペクトル表示
% フィルタマスクの作成
[f1,f2] = freqspace(256,'meshgrid'); % 画像FFT分の周波数領域メッシュを作成
r = sqrt(f1.^2 + f2.^2); % DCからの距離を求める
Hd = ones(256);
%Hd((r<0.1) | (r>0.5)) = 0; % バンドパスフィルタ (切り替え)
Hd(r>0.2) = 0; % ローパスフィルタ (切り替え)
figure(2);
mesh(f1,f2,Hd) % 周波数領域のマスクを表示
filtered_J = J.*Hd; % フィルタ処理 (周波数領域)
filtered_J = ifftshift(filtered_J); % 周波数領域を 0 ~ 2*pi に戻す
K = ifft2(filtered_J); % IFFT処理で空間領域へ変換
figure(3),imshow(K,[]) % フィルタ後の画像表示
なお、MATLABの fft2 は、画像に対して2次元FFTする場合は、周波数領域の画像の左上をDC成分として 0 ~ 2*pi までの領域のデータとなります。
DC成分を中心として -pi ~ pi までの周波数領域へコンバートする方法は、 fftshift , その逆変換が ifftshift となります。
DC成分を中心とした画像に対して、 周波数領域のマスク行列を掛け算することで、フィルタ処理を実現することができます。
  1 件のコメント
朋貴 熊田
朋貴 熊田 2021 年 8 月 2 日
ご回答ありがとうございます。
また丁寧に分かりやすくコードを書いて頂きありがとうございます。

サインインしてコメントする。

その他の回答 (0 件)

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!