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

조회 수: 90 (최근 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개)

카테고리

Help CenterFile Exchange에서 周波数変換에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!