原画像のノイズ、信号の振幅を維持した周波数フィルタを行う方法
24 views (last 30 days)
Show older comments
以下のプログラムを組んでイメージの周波数フィルタを行っています。
周波数フィルタ事体は問題なく動作していますが、フィルタ後の出力された時に原画像のノイズ、信号の振幅を維持出来ません。
これを維持したまま周波数フィルタを行う事は難しいのでしょうか?
周波数領域におけるマスク処理
% 画像の読み込み
img=imread('C:/',"bmp");
img2=imread('c:/','bmp');
[a,b]=size(img);
% 画像に対してFFT
J= fft2(img); %画像に対して 2次元FFT (周波数領域 0 ~ 2*pi)
J2=fft2(img2);
J = fftshift(J); % 周波数領域を-pi~piとする (DCを中央にする)
J2=fftshift(J2);
%figure(1);
imshow(20*log10(abs(J)),[]) % 画像の振幅スペクトル表示
%figure(2);
%imshow(20*log10(abs(J2)),[])
% フィルタマスクの作成
[f1,f2] = freqspace([a b],'meshgrid'); % 画像FFT分の周波数領域メッシュを作成
r = sqrt(f1.^2 + f2.^2); % DCからの距離を求める
Hd = ones(a,b);
LHd= ones(a,b);
R=0.08;%フィルタマスクの半径
%Hd((r<0.1) | (r>0.5)) = 0; % バンドパスフィルタ (切り替え)
LHd(r>R) = 0; % ローパスフィルタ (切り替え)
Hd(r<R) = 0;%ハイパスフィルタ(切り替え)
%figure(3);
mesh(f1,f2,Hd) % 周波数領域のマスクを表示
%figure(4)
%mesh(f1,f2,LHd)
filtered_J = J.*Hd; % ハイパスフィルタ処理 (周波数領域)
filtered_J2= J2.*Hd;
Lfiltered_J = J.*LHd; %ローパスフィルタ処理 (周波数領域)
Lfiltered_J2= J2.*LHd;
filtered_J = ifftshift(filtered_J); % 周波数領域を 0 ~ 2*pi に戻す
filtered_J2=ifftshift(filtered_J2);
Lfiltered_J = ifftshift(Lfiltered_J); % 周波数領域を 0 ~ 2*pi に戻す
Lfiltered_J2=ifftshift(Lfiltered_J2);
K = ifft2(filtered_J); % IFFT処理で空間領域へ変換
K2= ifft2(filtered_J2);
L=ifft2(Lfiltered_J);
L2=ifft2(Lfiltered_J2);
[kmin,I]=min(K,[],'all');
[r,c]=ind2sub([a b],I);
newK=K+abs(min(K,[],"all"));%画像表示の為に最小値0、最大値255になる様に変更
newK=newK./max(newK,[],"all");
newK2=K2+abs(min(K2,[],"all"));
newK2=newK2./max(newK2,[],"all");
newL=L+abs(min(L,[],"all"));
newL=newL./max(newL,[],"all");
newL2=L2+abs(min(L2,[],"all"));
newL2=newL2./max(newL2,[],"all");
figure(5),imshow(K,[]) % フィルタ後の画像表示
figure(6),imshow(L,[])
figure(7),imshow(K2,[])
figure(8),imshow(L2,[])
imwrite(newK,sprintf('c:/',R))
imwrite(newL,sprintf('c:/',R))
imwrite(newK2,sprintf('c:/',R))
imwrite(newL2,sprintf('c:/',R))
0 Comments
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!