TEKNIK PENGOLAHAN CITRA Kuliah 9 – Filtering in Frequency Domain
Indah Susilawati, S.T., M.Eng.
Program Studi Teknik Informatika Program Studi Sistem Informasi Fakultas Teknik dan Ilmu Komputer Universitas Mercu Buana Yogyakarta 2013 1
KULIAH 9 TEKNIK PENGOLAHAN CITRA FILTERING IN FREQUENCY DOMAIN (PENAPISAN DI DOMAIN FREKUENSI) Ideal Filtering: Low Pass Filtering Misal diketahui suatu matriks hasil transformasi Fourier yang telah digeser sehingga koefisien DC-nya berada di pusat matriks. Oleh karena komponen frekuensi rendah berada di pusat matriks, maka low pass filtering dapat dilakukan dengan mengalikan matriks tersebut dengan suatu matriks sedemikian sehingga nilai-nilai yang berada di pusat matriks dipertahankan, dan nilai-nilai yang jauh dari pusat dihilangkan atau diminimalkan. Salah satu cara untuk melakukan hal ini adalah dengan mengalikannya dengan suatu matriks low pass ideal yang didefinisikan sebagai berikut. 1, jika jarak titik ( x, y) ke pusat lebih dekat daripada D m( x, y) 0, jika jarak titik ( x, y) ke pusat lebih jauh daripada D
Misalnya adalah dengan lingkaran dengan radius D = 15 (seperti yang digunakan pada pertemuan yang lalu). [x,y] = meshgrid(-128:127, -128: 127) z = sqrt(x.^2 + y.^2) c = (z<15) imshow (c)
Sebuah lingkaran dengan D = 15
2
Maka IDFT dari perkalian yang terjadi dapat dinyatakan sbb.
Berikut adalah contoh low pass filtering dalam domain frekuensi. clear all; clc; % -----------------------------------------------% Membaca citra dan melakukan transformasi Fourier % Menggeser koefisien DC ke pusat matriks % -----------------------------------------------I = imread ('einstein.jpg'); If = fft2(I); If = fftshift(If); % ----------------------------------------------% Membuat filter low pass berupa lingkaran dengan % radius D = 15 % ----------------------------------------------[x,y] = meshgrid(-128:127, -128: 127) z = sqrt(x.^2 + y.^2) c = (z<15) % ----------------------------------------------% Mengalikan matriks hasil transf. Fourier dengan % filter low pass % Dalam Matlab .* adalah perkalian element-wise % antara dua matriks % ----------------------------------------------If_low = If.*c; % ----------------------------------------------% Melakukan IDFT pada hasil filtering % ----------------------------------------------If_low_inv = ifft2(If_low); % ----------------------------------------------% Menampilkan hasil % ----------------------------------------------subplot (2,2,1), imshow (I) subplot (2,2,2), fftshow (If) subplot (2,2,3), imshow (c) subplot (2,2,4), fftshow (If_low_inv, 'abs')
3
citra asli
DFT citra
Filter low pass
Citra hasil filtering
Dengan menggunakan citra yang lain, tampak sbb.
citra asli
DFT citra
Filter low pass
Citra hasil filtering
4
Pada citra hasil filtering dengan LPF tampak efek yang disebut “ringing”. Hal ini disebabkan oleh cutoff yang tajam pada lingkaran. Semakin kecil lingkaran yang digunakan sebagai filter, maka citra hasil filtering akan semakin kabur (blurr), dan sebaliknya semakin besar lingkaran maka semakin berkurang tingkat ke-kabur-an pada citra hasil filtering. Dua gambar berikut menunjukkan hasil filtering dengan D=5 dan D=30. citra asli
DFT citra
Filter low pass
Citra hasil filtering
D=5 ----------------------------------------------------------------------------------------------------citra asli
DFT citra
Filter low pass
Citra hasil filtering
D = 30 5
Ideal Filtering: High Pass Filtering High Pass Filtering dapat dilakukan dengan cara yang berkebalikan dengan cara yang dilakukan pada How Pass Filtering, yaitu dengan menghilangkan elemen-elemen (nilai-nilai) pada pusat matriks dan mempertahankan nilai-nilai yang lain. Secara sederhana hal ini dapat dilakukan dengan membuat lingkaran yang berkebalikan dengan yang digunakan pada low pass filtering yaitu lingkaran hitam dengan latar belakang putih. 0, jika jarak titik ( x, y) ke pusat lebih dekat daripada D m( x, y) 1, jika jarak titik ( x, y) ke pusat lebih jauh daripada D
Misalnya adalah dengan lingkaran dengan radius D = 15 [x,y] = meshgrid(-128:127, -128: 127) z = sqrt(x.^2 + y.^2) c = (z>15) imshow (c)
Sebuah lingkaran dengan D = 15
Berikut adalah contoh high pass filtering dalam domain frekuensi, menggunakan filter high pass di atas.
6
citra asli
DFT citra
Filter high pass
Citra hasil filtering
D = 15 -----------------------------------------------------------------------------------------------
citra asli
DFT citra
Filter high pass
Citra hasil filtering
D=5
7
citra asli
DFT citra
Filter high pass
Citra hasil filtering
D = 30 ------------------------------------------------------------------------------------------------------
Semakin besar cutoff maka semakin banyak bagian yang dihilangkan dari matriks hasil transformasi; artinya hanya frekuensi-frekuensi tertinggi saja yang tertinggal, hal ini terlihat pada hasil restorasi citra dimana hanya tebing-tebing citra (edges) saja yang tampak. Jika cutoff kecil, maka hanya frekuensi-frekuensi terendah saja yang dihilangkan, hasil restorasi masih tampak terdapat aras keabuan.
Filter Butterworth Ideal filtering secara sederhana memotong matriks hasil transformasi Fourier pada jarak tertentu dari pusat matriks. Cara ini memang mudah diimplementasikan namun ada kekurangannya, yaitu menimbulkan efek “ringing” pada citra hasil akhirnya (hasil restorasi atau hasil IDFT). Cara untuk mengatasi kekurangan ini adalah dengan menggunakan matriks filter yang berupa lingkaran dengan cutoff yang tidak terlalu tajam. Jenis filter semacam ini salah satunya adalah filter Butterworh. Filter low pass dan high pass yang ideal dapat dinyatakan dengan fungsi sebagai berikut.
8
1, jika r D LPF f (r ) 0, jika r D 1, jika r D HPF f (r ) 0, jika r D
Dengan r adalah jarak dari pusat matriks dan D adalah jarak cutoff. Fungsi-fungsi ini diilustrasikan pada gambar berikut.
Fungsi-fungsi filter Butterworth didasarkan pada persamaan-persamaan berikut. Untuk LPF
f (r )
1 1 ( r / D) 2 n
f (r )
1 1 ( D / r ) 2n
Untuk HPF
Dengan parameter n adalah orde dari filter, orde menentukan ketajaman cutoff dari filter yang dibuat. Berikut ilustrasi grafis fungsi filter Butterworth dengan n = 2 dan n = 4.
9
Fungsi filter Butterworth dengan n = 2
Fungsi filter Butterworth dengan n = 4
Salah satu variasi dari fungsi filter Butterworth LPF adalah yang dinyatakan dengan persamaan berikut.
f (r )
1 1 C ( r / D) 2 n
Dengan C adalah suatu konstanta. Pada persamaan yang dinyatakan sebelumnya adalah kasus jika diambil C = 1, sehingga saat r = D maka magnitude f(r) = 0,5. Nilai konstanta lain yang juga sering dipakai adalah C = 0,414, sehingga saat r = D maka nilai magnitude f(r) = 1/2. Berikut akan diberikan contoh membangun filter Butterworth LPF dengan C = 0,414 dan opsi masukan citra, jarak cutoff, dan orde filter. 10
function out = Lbutter(im, d, n) % --------------------------------------------------------% Lbutter (im, d, n) membentuk filter Butterworth LPF % ukuran filter sama dengan ukuran citra im % cutoff adalah d % orde filter adalah n % sintaks: % im = imread ('cameraman.tif'); % low = Lbutter (im, 25, 2); % --------------------------------------------------------height = size (im, 1); width = size (im, 2); [x, y] = meshgrid (-floor(width/2): floor((width-1)/2):... -floor(height/2):floor((height-1)/2)); out = 1./(1+(sqrt(2)-1)*((x.^2 + y.^2)/d^2).^n);
Filter Butterworth HPF dapat dibangun dengan mengurangkan LPF-nya dari 1, sehingga dapat dibuat fungsinya dengan mudah ( HPF = 1 – LPF ). function out = Hbutter(im, d, n) % --------------------------------------------------------% Hbutter (im, d, n) membentuk filter Butterworth HPF % ukuran filter sama dengan ukuran citra im % cutoff adalah d % orde filter adalah n % sintaks: % im = imread ('cameraman.tif'); % low = Hbutter (im, 25, 2); % --------------------------------------------------------out = 1 - Lbutter (im, d, n); Berikut contoh filtering dengan filter Butterworth LPF dan menggunakan fungsi-fungsi di atas. clear all; clc; % ---------------------------------------I = imread ('cameraman.tif'); If = fft2(I); 11
If = fftshift(If); % ---------------------------------------lb = Lbutter (If, 15, 1); % ---------------------------------------If_lb = If.*lb; % ---------------------------------------If_lb_inv = ifft2(If_lb); % ---------------------------------------subplot (2,2,1), imshow (I) title ('citra asli') subplot (2,2,2), fftshow (If) title ('DFT citra') subplot (2,2,3), imshow (lb) title ('Filter low pass') subplot (2,2,4), fftshow (If_lb_inv, 'log') title ('Citra hasil filtering')
citra asli
DFT citra
Filter low pass
Citra hasil filtering
Jika digunakan filter Butterworth HPF, hasilnya sebagai berikut.
12
citra asli
DFT citra
Filter high pass
Citra hasil filtering
Jika digunakan n = 2 dan opsi „abs‟ fungsi fftshow, hasilnya sebagai berikut. citra asli
DFT citra
Filter high pass
Citra hasil filtering
13
Gaussian Filtering Filter Gaussian juga dapat dilakukan dalam domain frekuensi, yaitu untuk low pass filtering. Implementasinya sama dengan yang dilakukan pada proses sebelumnya, yaitu membangun filter Gaussian, mengalikannya dengan matriks hasil transformasi Fourier, dan menginversikan hasilnya. Filter Gaussian merupakan jenis filter yang “paling smooth” dan filter ideal merupakan filter yang “paling tidak smooth”. Sedangkan filter Butterworth berada di antara keduanya.
Contoh clear all; clc; % ------------------------------------I = imread ('cameraman.tif'); If = fft2(I); If = fftshift(If); % ------------------------------------g1 = fspecial('gaussian', 256, 10); g1 = mat2gray(g1); Ifg1 = If.*g1; Ifg1_inv = ifft2(Ifg1); % ------------------------------------g2 = fspecial('gaussian', 256, 30); g2 = mat2gray(g2); Ifg2 = If.*g2; Ifg2_inv = ifft2(Ifg2); % ------------------------------------subplot (2,2,1), fftshow (Ifg1,'log') title ('std = 10') subplot (2,2,2), fftshow (Ifg1_inv, 'abs') title ('Citra hasil') subplot (2,2,3), fftshow (Ifg2, 'log') title ('std = 30') subplot (2,2,4), fftshow (Ifg2_inv, 'abs') title ('Citra hasil') Keterangan: Std = standart deviasi
14
std = 10
Citra hasil
std = 30
Citra hasil
Dengan cara yang serupa, dapat dibangun filter Gaussian high pass dengan mengurangkan filter Gaussian low pass dari satu (HPF = 1 – LPF).
Contoh clear all; clc; % ------------------------------------I = imread ('cameraman.tif'); If = fft2(I); If = fftshift(If); % ------------------------------------g1 = fspecial('gaussian', 256, 10); g1 = mat2gray(g1); h1 = 1 - g1; Ifh1 = If.*h1; 15
Ifh1_inv = ifft2(Ifh1); % ------------------------------------g2 = fspecial('gaussian', 256, 30); g2 = mat2gray(g2); h2 = 1 - g2; Ifh2 = If.*h2; Ifh2_inv = ifft2(Ifh2); % ------------------------------------subplot (1,2,1), fftshow (Ifh1_inv, 'abs') title ('Menggunakan std = 10') subplot (1,2,2), fftshow (Ifh2_inv, 'abs') title ('Menggunakan std = 30')
Menggunakan std = 10
Menggunakan std = 30
Tugas 1. Buatlah citra wajah seseorang yang anda kenal dengan kamera digital. Bereksperimenlah dengan menerapkan transformasi Fourier pada citra tersebut dan kemudian terapkan filter ideal (low pass dan high pass). Berapa radius terkecil dari LPF sehingga anda masih bisa mengenali wajahnya? 2. Buatlah citra wajah seseorang yang anda kenal dengan kamera digital. Bereksperimenlah dengan menerapkan transformasi Fourier pada citra tersebut dan kemudian terapkan filter Butterworth (low pass dan high pass). Berapa radius terkecil dari LPF sehingga anda masih bisa mengenali wajahnya? 16
3. Carilah formula untuk membangun filter Gaussian dan kemudian buatlah coding-nya untuk membuat fungsi filter Gaussian dari formula tersebut. Kemudian lakukan filtering yang sama dengan coding pada halaman 14 namun menggunakan fungsi yang anda buat tadi (tidak menggunakan fspecial dari Matlab). Bandingkan hasilnya.
17