Understanding fft and filtering techniques
์ฃผํ์ ์์ญ์์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ: FFT์ ํํฐ๋ง ๊ธฐ๋ฒ์ ๋ํ ์ดํด
1. ๊ธฐ๋ณธ์ ์ธ FFT ๊ฐ๋ ๊ณผ ๋ฒกํฐ ์ฒ๋ฆฌ
1.1 ๋ฒกํฐ์ FFT ๋ณํ
์ฝ๋์ ์ฒซ ๋ถ๋ถ์์๋ ๊ธฐ๋ณธ์ ์ธ FFT(Fast Fourier Transform) ์ฐ์ฐ์ ํน์ฑ์ ๋ณด์ฌ์ค๋๋ค. ๋ฒกํฐ์ ๋ํ FFT ๋ณํ ์ ์ฃผ์ํ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- MATLAB์์ FFT ๊ฒฐ๊ณผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ฒกํฐ(column vector)๋ก ๋ฐํ๋ฉ๋๋ค.
- ํ ๋ฒกํฐ์ ๊ฒฝ์ฐ transpose(โ)๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฒกํฐ๋ก ๋ณํ ํ FFT๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
MATLAB์์ FFT๋ฅผ ๋ค๋ฃฐ ๋์ ๊ธฐ๋ณธ์ ์ธ ํน์ฑ์ ์ดํด๋ด ์๋ค:
a = [1 2 3 4 5 6];
fft(a') % column vector๋ก ๋ณํ
fft(a) % row vector ๊ฒฐ๊ณผ
1.2 ์ํ ํฉ์ฑ๊ณฑ(Circular Convolution)
์ํ ํฉ์ฑ๊ณฑ์ ์ฃผํ์ ์์ญ์์์ ์ค์ํ ์ฐ์ฐ์ ๋๋ค:
- conv() ํจ์: ์ ํ ํฉ์ฑ๊ณฑ์ ์ํ
- cconv() ํจ์: ์ํ ํฉ์ฑ๊ณฑ์ ์ํ
- ์ํ ํฉ์ฑ๊ณฑ์ FFT๋ ๊ฐ ์ ํธ์ FFT์ ๊ณฑ๊ณผ ๋์ผํจ์ ๋ณด์ฌ์ค๋๋ค. (์ค์ํ ํน์ฑ)
์ํ ํฉ์ฑ๊ณฑ๊ณผ ์ผ๋ฐ ํฉ์ฑ๊ณฑ์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ์ ๋๋ค:
a = [1 2 3 4];
b = [5 6 7 8];
conv(a,b) % ์ผ๋ฐ ํฉ์ฑ๊ณฑ
cconv(a,b,4) % ์ํ ํฉ์ฑ๊ณฑ
% ์ํ ํฉ์ฑ๊ณฑ์ FFT ํน์ฑ ํ์ธ
fft((cconv(a,b,4))')
fft(a').*fft(b');
ifft(ans)'
1.3 ํธ๋ฆฌ์ ๋ณํ์ ์ด๋์ฑ(Shifting)
์ํํ ํน์ฑ์ ๋ณด์ฌ์ฃผ๋ ์ค์ํ ์์ ์ ๋๋ค:
x = [2 3 4 5 6 7 8 1];
x1 = (-1).^[0:7].*x % 2 -3 4 -5 6 -7 8 -1
X = fft(x')
X1 = fft(x1')
2. ๊ธฐ๋ณธ ๋ํ ์์ฑ๊ณผ ์ฃผํ์ ๋ถ์
2.1 ์ฌ๊ฐํ ํจํด ์์ฑ
meshgrid ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๊ธฐ๋ณธ ๋ํ์ ์์ฑํ๊ณ ์ด๋ค์ ์ฃผํ์ ํน์ฑ์ ๋ถ์ํฉ๋๋ค:
- ์ฌ๊ฐํ: zeros์ ones๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ
- ์: meshgrid์ sqrt๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ฆฌ ๊ณ์ฐ ํ ์๊ณ๊ฐ ์ ์ฉ
- ๋ง๋ฆ๋ชจ: ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์์ญ ์ ์
a = zeros(256, 256);
a(78:178, 78:178) = 1;
figure, imshow(a)
af = fftshift(fft2(a));
figure, fftshow(af, 'log');
2.2 ๋ง๋ฆ๋ชจ ํจํด ์์ฑ
[x,y] = meshgrid(1:256, 1:256);
b = (x+y<329) & (x+y>182) & (x-y>-67) & (x-y<73);
figure, imshow(b), impixelinfo
bf = fftshift(fft2(b));
figure, fftshow(bf, 'log');
2.3 ์ํ ํจํด ์์ฑ
[x,y] = meshgrid(-128:127, -128:127);
z = sqrt(x.^2 + y.^2);
c = (z<30);
figure, imshow(c);
cf = fftshift(fft2(c));
figure, fftshow(cf, 'log');
3. ์ฃผํ์ ์์ญ ํํฐ๋ง
3.1 ์ ์ฃผํ ํต๊ณผ ํํฐ๋ง(Low-pass Filtering)
[x,y] = meshgrid(-128:127, -128:127);
z = sqrt(x.^2+y.^2);
c = (z<30); % ์ ์ฃผํ ํต๊ณผ ํํฐ ๋ง์คํฌ
figure, imshow(c);
cf = fftshift(fft2(c));
figure, fftshow(cf, 'log')
cm = imread('cameraman.tif');
cmf = fftshift(fft2(cm));
figure, imshow(cm);
cf = fftshift(fft2(cm));
figure, fftshow(cf);
cfl = cf.*c;
figure, fftshow(cfl, 'log');
cfli=ifft2(cfl);
figure, fftshow(cfli, 'abs');
3.2 ๊ณ ์ฃผํ ํต๊ณผ ํํฐ๋ง(High-pass Filtering)
[x,y] = meshgrid(-128:127, -128:127);
z = sqrt(x.^2+y.^2);
c = (z>15); % ๊ณ ์ฃผํ ํต๊ณผ ํํฐ ๋ง์คํฌ
figure, imshow(c);
cf = fftshift(fft2(c));
figure, fftshow(cf, 'log')
cm = imread('cameraman.tif');
cf = fftshift(fft2(cm));
cfh = cf.*c;
figure, fftshow(cfh, 'log');
cfhi=ifft2(cfh);
figure, fftshow(cfhi, 'abs');
3.3 ๋์ญ ์ ๊ฑฐ ํํฐ๋ง(Band-reject Filtering)
[x,y] = meshgrid(-128:127, -128:127);
z = sqrt(x.^2+y.^2);
c = (z>5 & z<20); % ๋์ญ ์ ๊ฑฐ ํํฐ ๋ง์คํฌ
figure, imshow(c);
cf = fftshift(fft2(c));
figure, fftshow(cf, 'log')
cm = imread('cameraman.tif');
cmf = fftshift(fft2(cm));
cfh = cf.*c;
cfhi=ifft2(cfh);
figure, fftshow(cfhi, 'abs');
3.4 ๊ฐ์ฐ์์ ํํฐ๋ง
cm = imread('cameraman.tif');
cf = fftshift(fft2(cm));
g1 = mat2gray(fspecial('gaussian',256,10));
g2 = mat2gray(fspecial('gaussian',256,30));
h1 = 1-g1; % ๊ณ ์ฃผํ ํต๊ณผ ๊ฐ์ฐ์์ ํํฐ
h2 = 1-g2;
ch1 = cf.*h1;
ch2 = cf.*h2;
chi1 = ifft2(ch1);
chi2 = ifft2(ch2);
3.5 ๋ฒํฐ์์ค ํํฐ๋ง
cm = imread("cameraman.tif");
cf = fftshift(fft2(cm));
[x,y] = meshgrid(-128:127,-128:127);
bl = 1./(1+((x.^2+y.^2)/15).^2); % ๋ฒํฐ์์ค ์ ์ฃผํ ํต๊ณผ ํํฐ
bl = lbutter(cm,15,1);
cfbl = cf.*bl;
cfbli = ifft2(cfbl);
bh = hbutter(cm,15,1); % ๋ฒํฐ์์ค ๊ณ ์ฃผํ ํต๊ณผ ํํฐ
cfbh = cf.*bh;
cfbhi = ifft2(cfbh);
4. ์ฃผ๊ธฐ์ ๋ ธ์ด์ฆ ์ ๊ฑฐ ์์
tw = imread("twins.tif");
t = rgb2gray(tw);
figure(1),imshow(t);
[x,y] = meshgrid(1:256,1:256);
p = 1+sin(x+y/1.5); % ์ฃผ๊ธฐ์ ๋
ธ์ด์ฆ ์์ฑ
tp = (double(t)/128+p)/4;
figure(2),imshow(tp);
tf = fftshift(fft2(tp));
figure(3), fftshow(tf), impixelinfo;
z = sqrt((x-129).^2+(y-129).^2);
% Band reject ํํฐ ์ ์ฉ
br = (z<47 | z>51);
tbr = tf.*br;
figure(4), fftshow(tbr);
tbri = ifft2(tbr);
figure(5), fftshow(tbri);
% Notch ํํฐ ์ ์ฉ
tf(156,:) = 0;
tf(102,:) = 0;
tf(:,170) = 0;
tf(:,88) = 0;
figure(5), fftshow(tf);
tfi = ifft2(tf);
figure(6), fftshow(tfi);
๊ฒฐ๋ก
์ด MATLAB ์ฝ๋๋ค์ ์ฃผํ์ ์์ญ์์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ธฐ๋ฒ๋ค์ ํฌ๊ด์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ํนํ:
- ๊ธฐ๋ณธ์ ์ธ FFT ๊ฐ๋ ๋ถํฐ ์์ํ์ฌ
- ๋ค์ํ ๊ธฐํํ์ ํจํด์ ์ฃผํ์ ํน์ฑ ๋ถ์
- ์ฌ๋ฌ ์ข ๋ฅ์ ํํฐ๋ง ๊ธฐ๋ฒ (์ ์ฃผํ/๊ณ ์ฃผํ/๋์ญ์ ๊ฑฐ/๊ฐ์ฐ์์/๋ฒํฐ์์ค)
- ์ค์ ์ด๋ฏธ์ง์์์ ๋ ธ์ด์ฆ ์ ๊ฑฐ๊น์ง
๊ฐ ๊ธฐ๋ฒ๋ค์ ์๋ก ๋ค๋ฅธ ํน์ฑ๊ณผ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ชฉ์ ์ ๋ง๋ ์ ์ ํ ํํฐ๋ง ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ๋ค์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์ปดํจํฐ ๋น์ ๋ถ์ผ์์ ๋๋ฆฌ ํ์ฉ๋๊ณ ์์ต๋๋ค.
์ค์ ์์ฉ ๋ถ์ผ
- ์๋ฃ ์์ ์ฒ๋ฆฌ
- MRI, CT, X-ray ์์์ ๋ ธ์ด์ฆ ์ ๊ฑฐ
- ์๋ฃ ์์์ ์ ๋ช ๋ ๊ฐ์
- ํน์ ์กฐ์ง์ด๋ ๋ณ๋ณ์ ๊ฐ์กฐ
- ์์ฑ ์์ ์ฒ๋ฆฌ
- ๊ธฐ์ ์์ฑ ์ด๋ฏธ์ง์ ๋ ธ์ด์ฆ ์ ๊ฑฐ
- ์งํ ํน์ง ๊ฐ์กฐ
- ๋๊ธฐ ํจ๊ณผ ๋ณด์
- ์ฐ์
ํ์ฅ ํ์ง ๊ด๋ฆฌ
- ์ ํ ํ๋ฉด ๊ฒฐํจ ๊ฒ์ฌ
- ๋ฐ๋์ฒด ์จ์ดํผ ๊ฒ์ฌ
- ์ธ์ ํ๋ก ๊ธฐํ(PCB) ๊ฒ์ฌ
- ๋ณด์ ๋ฐ ๊ฐ์ ์์คํ
- CCTV ์์ ํ์ง ๊ฐ์
- ์์ฒด ์ธ์ ์์คํ ์ ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ
- ๋ฒํธํ ์ธ์ ์์คํ
- ๋์งํธ ์นด๋ฉ๋ผ ๋ฐ ์ค๋งํธํฐ
- ์ฌ์ง์ ๋ ธ์ด์ฆ ์ ๊ฑฐ
- ์ด๋ฏธ์ง ์ ๋ช ๋ ๊ฐ์
- HDR ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์ด๋ฌํ ์ค์ ์์ฉ ์ฌ๋ก๋ค์ ์ฃผํ์ ์์ญ์์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ค์ํ๊ณ ์ค์ฉ์ ์ธ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํนํ ์๋ฃ ์์์ด๋ ์ฐ์ ์ฉ ๊ฒ์ฌ ์์คํ ์์๋ ๋์ ์ ํ๋์ ์ ๋ขฐ์ฑ์ด ์๊ตฌ๋๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ํํฐ๋ง ๊ธฐ๋ฒ๋ค์ ์ ํํ ์ดํด์ ์ ์ฉ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.