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

186 views (last 30 days)
朋貴 熊田
朋貴 熊田 on 29 Jul 2021
Commented: 朋貴 熊田 on 2 Aug 2021
画像をフーリエ変換して表示する所までは出来ました。しかし、そこからマスク処理を行い逆変換をし、ハイパスなりローパスなりのフィルタ処理を行う方法が分かりませんご教授お願い致します。
img=imread('C:/SNR/slow40s_same.bmp');
imshow(img)
FFT=fft2(img);
Fimg=figure;imshow(log(abs(fftshift(FFT))),[])

Accepted Answer

Naoya
Naoya on 2 Aug 2021
下記のようなスクリプトのフローで実現できると思います。
% 画像の読み込み (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 Comment
朋貴 熊田
朋貴 熊田 on 2 Aug 2021
ご回答ありがとうございます。
また丁寧に分かりやすくコードを書いて頂きありがとうございます。

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!