• Tidak ada hasil yang ditemukan

Ekstraksi Fitur Bentuk dan Kontur

N/A
N/A
Protected

Academic year: 2021

Membagikan "Ekstraksi Fitur Bentuk dan Kontur"

Copied!
74
0
0

Teks penuh

(1)

BAB 12

Ekstraksi

Fitur Bentuk dan

Kontur

Setekah bab ini berakhir, diharapkan pembaca mendapatkan berbagai bahasan yang berhubungan

dengan pemerolehan fitur bentuk dan kontur serta mampu mempraktikkannya.

 Ekstraksi fitur

 Tanda-tangan Kontur  Deskriptor Fourier  Sifat bundar

 Convex hull dan soliditas

 Momen spasial dan momen pusat  Momen invariant

 Momen jarak ke pusat

Momen Zernike

 Polar Fourier Transform  Kotak pembatas

(2)

12.1 Pengantar Ekstraksi Fitur

Beberapa fitur berdasarkan bentuk dan kontur telah dibahas pada Bab 8. Sebagai contoh, fitur kekompakan diperoleh melalui perimeter dan luas objek. Beberapa fitur lain yang telah dikupas antara lain berupa dispersi dan kerampingan.

Pada bab ini, beberapa fitur lain yang terkait dengan bentuk dan kontur akan dibahas. Fitur-fitur yang dimaksud antara lain tanda tangan kontur, deskriptor Fourier, dan momen Zernike. Namun, sebelum membahas fitur-fitur tersebut, dua pengertian dasar akan dibahas, yaitu bentuk, deskriptor dan fitur. Definisi bentuk menurut D.G. Kendall (Stegmann dan Gomez, 2002) adalah infomasi geometris yang tetap ketika efek lokasi, skala, pemutaran dilakukan terhadap sebuah objek (lihat Gambar 12.1). Deskriptor adalah seperangkat parameter yang mewakili karakteristik tertentu objek, yang dapat digunakan untuk menyatakan fitur objek. Adapun fitur dinyatakan dengan susunan bilangan yang dapat dipakai untuk mengidentifikasi objek.

Gambar 12.1 Objek yang sama melalui efek penyekalaan (b), translasi (c), dan pemutaran (d)

Fitur-fitur suatu objek mempunyai peran yang penting untuk berbagai aplikasi berikut.

1. Pencarian citra: Fitur dipakai untuk mencari objek-objek tertentu yang berada di dalam database.

(3)

2. Penyederhanaan dan hampiran bentuk: Bentuk objek dapat dinyatakan dengan representasi yang lebih ringkas.

3. Pengenalan dan klasifikasi: Sejumlah fitur dipakai untuk menentukan jenis objek. Sebagai contoh, fitur citra daun digunakan untuk menentukan nama tanaman.

Untuk kepentingan aplikasi yang telah disebutkan, fitur hendaknya efisien. Fitur yang efisien perlu memenuhi sifat-sifat penting berikut (Mingqiang, dkk., 2008).

1. Teridentifikasi: Fitur berupa nilai yang dapat digunakan untuk membedakan antara suatu objek dengan objek lain. Jika kedua fitur tersebut didampingkan, dapat ditemukan perbedaan yang hakiki. Hal ini sama seperti kalau dilakukan oleh manusia secara visual.

2. Tidak dipengaruhi oleh translasi, rotasi, dan penyekalaan: Dua objek yang sama tetapi berbeda dalam lokasi, arah pemutaran, dan ukuran tetap dideteksi sama.

3. Tidak bergantung pada affine: Pengertian affine telah dibahas pada Bab 5. Idealnya, efek affine tidak mempengaruhi fitur.

4. Tahan terhadap derau: Fitur mempunyai sifat yang andal terhadap derau atau cacat data. Sebagai contoh, daun yang sama tetapi salah satu sedikit robek tetap dikenali sebagai objek yang sama.

5. Tidak bergantung pada tumpang-tindih: Apabila objek sedikit tertutupi oleh objek lain, fitur bernilai sama dengan kalau objek itu terpisah.

6. Tidak bergantung secara statistis: Dua fitur harus tidak bergantung satu dengan yang lain secara statistik.

12.2 Tanda-Tangan Kontur

Tanda-tangan kontur didefinisikan sebagai

(4)

Dalam hal ini, (𝑦̅, 𝑥̅) menyatakan pusat massa kontur, yang diperoleh melalui rumus 𝑦̅ = 1 𝑁∑ 𝑦(𝑖), 𝑁 𝑖 𝑥 ̅ = 1 𝑁∑ 𝑥(𝑖) 𝑁 𝑖 (12.2)

dengan n=1,2,3,….,N. Ilustrasi tanda-tangan kontur ditunjukkan pada Gambar 12.1. d(2) d(3) d(4) d(1) (𝑦̅, 𝑥̅) d(n)

Gambar 12.2 Tanda-tangan kontur diperoleh dengan mula-mula menghitung jarak antara pusat massa dan beberapa titik pada kontur

Contoh tanda-tangan empat objek ditunjukkan pada Gambar 12.2. Gambar 12.2(b) dan 12.2(d) menunjukkan bahwa translasi menghasilkan bentuk grafik tanda-tangan yang sama. Gambar 12.2(f) menunjukkan bahwa hasil rotasi membuat bentuk tanda tangan tergeser, sedangkan Gambar 12.2(h) menyatakan sedikit perbedaan pada objek membuat tanda tangan ikut berubah. Hal ini menunjukkan bahwa tanda-tangan kontur peka terhadap derau pada tepi objek.

(5)

(a) Citra ikan-1.png (b) Tanda-tangan ikan-1.png

(c) Citra ikan-2.png (d) Tanda-tangan ikan-2.png

(e) Citra ikan-4.png (f) Tanda-tangan ikan-4.png

(g) Citra ikan-5.png (h) Tanda-tangan ikan-5.png

Gambar 12.3 Contoh tanda-tangan empat citra ikan

Dalam praktik, titik-titik yang digunakan untuk memperoleh d(1) dilakukan dengan memindai kontur dari arah kiri dan atas. Titik pada kontur yang ditemukan pertama kali akan dipakai untuk menghitung d(1). Langkah selengkapnya diperlihatkan pada algoritma berikut.

(6)

ALGORITMA 10.1 – Memperoleh tanda-tangan objek

Masukan:

 f(M,N) : citra biner berukuran M x N Keluaran:

 jarak sebanyak piksel batas tandatangan(BW):

1. batas  inbound_tracing(f) 2. jum  jumlah piksel batas

3. [xp, yp]  pusat massa objek dalam f 4. FOR p  1 TO jum

Jarak(p)  jarak antara piksel batas (batas(p)) dan titik pusat massa

END-FOR 5. RETURN jarak

Fungsi yang dapat digunakan untuk memperoleh tanda-tangan dan menampilkan hasilnya ditunjukkan berikut ini.

function [Jarak] = tandatangan(BW)

% TANDATANGAN Digunakan untuk memperoleh jarak-jarak antara % piksel dalam batas objek dri citra biner BW

% Keluaran: Jarak - Berisi sejumlah pasangan Y, X % yang menyatakan jarak

[m,n] = size(BW);

Batas = double(inbound_tracing(BW));

[jum, z] = size(Batas);

[pusat_x, pusat_y] = centroid(BW); Program : tandatangan.m

(7)

Jarak = zeros(1,m); for p=1 : jum Jarak(p) = sqrt((Batas(p,1)-pusat_y)^2 + ... (Batas(p,2)-pusat_x)^2); end % Plot jarak X = 1: p; plot(X, Jarak); Akhir Program

Contoh untuk memperoleh tanda-tangan objek yang terdapat pada ikan-1.png :

>> Img = im2bw(imread('C:\Image\ikan-1.png'), 0.5);  >> X = tandatangan(Img); 

>>

Pada contoh di atas, im2bw dipakai untuk mengonversikan dari citra berskala keabuan ke citra biner. Terakhir, X akan berisi jarak setiap piksel pada kontur dari titik pusat massa.

Perlu diketahui, tanda-tangan yang telah dibahas di depan mempunyai sifat yang hanya bebas dari translasi, tetapi tidak bebas dari rotasi ataupun penyekalaan. Agar fitur yang didapatkan bebas dari rotasi dan penyekalaan, perlu langkah lebih lanjut. Salah satu cara yang dapat dilakukan adalah dengan memanfaatkan deskriptor Fourier.

12.3 Deskriptor Fourier

Deskriptor Fourier (Fourier Descriptor / FD) biasa dipakai untuk menjabarkan bentuk dalam dua dimensi dengan menggunakan transformasi Fourier. Deskriptor ini pertama kali dibahas pada tahun 1960 oleh Cosgriff (Nixon dan Aguado, 2002). Dengan menggunakan deskriptor Fourier, suatu bentuk dapat dinyatakan dengan sejumlah bilangan (yaitu koefisien Fourier).

(8)

Berbagai aplikasi telah menggunakan deskriptor Fourier, antara lain oleh Leon dan Sucar (2000) untuk mengenali bayangan manusia serta Zhang dan Lu (2003) yang menggunakannya untuk pencarian bentuk objek melalui beberapa jenis tanda tangan bentuk objek.

Konsep dasar untuk mendapatkan deskriptor Fourier sangat sederhana. Pertama-tama, kontur objek perlu didapatkan terlebih dahulu. Hal ini dapat dilakukan dengan memanfaatkan fungsi inbound_tracing yang dibahas di Bab 8. Selanjutnya, piksel-piksel di kontur tersebut ditransformasikan menggunakan FFT. Implementasinya ditunjukkan di bawah ini.

function [F] = perolehFD(Kontur)

% PEROLEHFD Memperoleh deskriptor Fourier berdasarkan % kontur suatu bentuk.

% Masukan: Kontur = kontur objek % Keluaran: F = deskriptor Fourier

jum = length(Kontur);

% Atur supaya jumlah elemen genap if rem(jum, 2) == 1

Kontur = [Kontur; Kontur(1,:)]; end

% Peroleh bentuk Fourier kontur K = Kontur(:, 2) - i * Kontur(:,1); F = fft(K);

Akhir Program

Dasar yang digunakan untuk memperoleh koefisien Fourier adalah transformasi Fourier berdimensi satu. Transformasi Fourier diskret berupa:

𝑢𝑜 = 1 𝑁∑ 𝑠(𝑡). exp ( −𝑗2𝜋𝑛𝑡 𝑁 ) 𝑁 𝑡 =0 , 𝑛 = 0,1,2, … , 𝑁 − 1 (12.3) Program : perolehFD.m

(9)

Nah, un dengan n = 0,1,2,..,N-1 dinamakan deskriptor Fourier untuk bentuk. Dalam implementasi di depan, transformasi Fourier dilaksanakan dengan menggunakan fungsi FFT yang disediakan di Octave dan MATLAB.

Untuk mempraktikkan fungsi perolehFD, cobalah perintah berikut:

>> Img = im2bw(imread('C:\Image\ikan-5.png'), 0.5);  >> Kontur = inbound_tracing(Img); 

>> F = perolehFD(Kontur); 

Dengan cara seperti itu, F berisi koefisien-koefisien Fourier (deskriptor Fourier). Jumlahnya tentu saja lebih kompak daripada ukuran citra ikan-5.png, karena hanya sebanyak piksel yang berada pada kontur objek. Hal ini ditunjukkan di bawah ini: >> length(F)  ans = 544 >> >> [m,n]=size(Img); m * n  ans = 62500 >>

Jumlah data pada citra sebanyak 62500 buah, sedangkan jumlah deskriptor Fourier hanya 544. Nilai 544 seperti itu pun masih dapat dikurangi. Hal ini akan dijelaskan belakangan.

Koefisien-koefisien yang tercatat dalam F dapat digunakan untuk membentuk kontur objek. Hal itu dapat ditangani oleh fungsi plotFD berikut.

function [] = plotFD(F)

% PLOTFD Menampilkan kontur berdasarkan deskriptor Fourier. % Masukan: F = Deskriptor Fourier

(10)

jum = length(F); if jum > 0

G = ifft(F); % Transformasi balik

G = [G; G(1)]; % Tambahkan elemen pertama plot(G);

axis off; end

Akhir Program

Contoh penggunaan plotFD dapat dilihat di bawah ini:

>> plotFD(F) 

Hasilnya ditunjukkan pada Gambar 12.4(b), yang menunjukkan kontur objek.

(a) Citra asli (b) Hasil melalui deskriptor Fourier

Gambar 12.4 Gambar kontur melalui deskriptor Fourier

Dalam praktik, deskriptor sebanyak 544 pada contoh di depan terlalu banyak kalau dijadikan sebagai fitur objek. Oleh karena itu, jumlah fitur yang perlu dikurangi. Adapun cara yang digunakan untuk mereduksi deskriptor Fourier dapat dilihat berikut ini.

(11)

function [G] = fiturFourier(F, n)

% FITURFOURIER Memperoleh fitur Fourier sebanyak n buah. % Masukan:

% F : Deskriptor Fourier yang lengkap % n : Jumlah fitur yang dikehendaki % Keluaran:

% G : Deskriptor Fourier sebanyak n buah jum = length(F); if jum > n K1 = fftshift(F); delta = round((jum-n) / 2); K2 = K1(1 + delta : n+delta); G = ifftshift(K2); else G = F; end Akhir Program

Kode di atas hanya akan mengubah deskriptor Fourier kalau jumlah elemen deskriptor semula melebihi jumlah deskriptor yang diminta (n). Pertama-tama, fungsi fftshift mengubah susunan F menjadi K seperti yang diperlihatkan pada Gambar 12.5. Selanjutnya,

delta = round((jum-n) / 2); K2 = K1(1 + delta : n+delta);

digunakan untuk mengambil n elemen pada K1 dimulai dari 1 + delta hingga n + delta. Hasilnya disusun ulang melalui fungsi ifftshift. Dengan cara seperti itu, jumlah deskriptor yang semula sebanyak jum diturunkan menjadi n.

(12)

m + in o + ip q + ir s + it q + ir s + it a + ib c + id q + ir s + it a + ib c + id e + if g + ih m + in o + ip q + ir s + it a + ib c + id e + if g + ih a + ib c + id

K1 = fftshift(F)

F

K1

8 elemen n = 4 delta = (8-4)/2 =2 1 + delta n + delta

K2

G

K1 = ifftshift(F)

Gambar 12.5 Mekanisme penurunan jumlah deskriptor

Cara menggunakan fungsi fiturFourier dan hasil deskriptor yang didapatkan ditunjukkan di bawah ini:

>> G = fiturFourier(F, 20);  >> plotFD(G) 

>>

Contoh hasil pemilihan berbagai jumlah deskriptor Fourier ditunjukkan pada Gambar 12.6. Sebagai contoh, dengan menggunakan seluruh deskriptor (n = 544), citra yang dihasilkan adalah kontur objeknya (Gambar 12.6(b)). Manakala jumlah deskriptor diturunkan menjadi 100, hasil kontur (Gambar 12.6(c)) masih menyerupai kontur pada Gambar 12.6(a). Namun, gambar kontur akan terus menjauh dari bentuk aslinya kalau n terlalu kecil.

(13)

(a) Citra ikan-5.png (b) n = 544

(c) n = 100 (d) n = 50

(e) n = 20 (f) n = 25

(g) n = 15 (h) n = 10

Gambar 12.6 Jumlah deskriptor Fourier dan pengaruh bentuk yang dihasilkan

(14)

Agar deskriptor Fourier mempunyai sifat yang bebas terhadap translasi, rotasi, penyekalaan, dan letak awal kontur, perlu dilakukan normalisasi. Pertama-tama yang perlu diketahui, kecuali komponen DC (a0), semua koefisien yang lain tidak dipengaruhi oleh translasi (Zhang, 2002). Oleh karena itu, komponen a0 dapat diabaikan. Agar bebas dari penyekalaan, semua koefisien perlu dibagi dengan a0. Selanjutnya, berdasarkan kenyataan bahwa dalam kawasan frekuensi ternyata rotasi hanya akan menyebabkan perbedaan dalam fase, maka fase diabaikan dengan hanya menggunakan besaran koefisien. Kalau koefisien setelah pembagian dengan ao menjadi bn, |bn| akan menghasilkan besaran koefisien. Implementasinya Dapat dilihat pada fungsi normalisasiFD berikut.

function [G] = normalisasiFD(F)

% NORMALISASIFD Digunakan untuk melakukan normalisasi % agar FD bebas dari transalasi, rotasi,

% penyekalaan, dan perubahaan titik awal.

G = F;

% Mengatur agar bebas terhadap penyekalaan m = abs(G(1)); % Ambil komponen kedua G = G ./ m; % Lakukan normalisasi

% Mengatur agar bebas rotasi dan perubahan titik awal G = abs(G);

Akhir Program

Hasil normalisasiFD tidak dapat digunakan untuk merekonstruksi kontur.

(15)

Untuk mengamati fitur yang dihasilkan dengan normalisasiFD, fungsi amatiFD berikut dapat digunakan.

function [] = amatiFD(berkas)

% AMATIFD Digunakan untuk mengamati deskriptor Fourier % yang telah dinormalisasi.

Img = im2bw(imread(berkas),0.5); K = inbound_tracing(Img); F = perolehFD(K); G = fiturFourier(F,30); H = normalisasiFD(G); bar(H); Akhir Program

Contoh penggunaan fungsi amatiFD:

>> amatiFD('C:\Image\guppi-1.png'); 

Hasil pengamatan berbagai citra diperlihatkan pada Gambar 12.7. Diagram batang untuk ikan-1.png hingga ikan-5.png menunjukkan bahwa ada kemiripan pola, sedangkan diagram batang untuk guppy-1.png menunjukkan ada perbedaan dengan kelompok ikan-1.png hingga ikan-5.png. Perlu juga diperhatikan, koefisien paling kiri (a0) selalu bernilai 1 karena efek normalisasi. Itulah sebabnya, nilai ini dapat diabaikan dalam pembandingan dua objek.

(16)

(a) Citra ikan-1.png (b) FD ikan-1.png (c) Citra ikan-2.png (d) FD ikan-2.png

(e) Citra ikan-3.png (f) FD ikan-3.png (g) Citra ikan-4.png (h) FD ikan-4.png

(i) Citra ikan-5.png (j) FD ikan-5.png (k) Citra guppi-1.png (l) FD guppi-1.png

Gambar 12.7 Deskriptor Fourier yang telah dinormalisasi untuk berbagai bentuk

12.4 Sifat Bundar

Sifat bundar (circularity) adalah perbandingan antara rerata jarak Euclidean dari sentroid terhadap tepi area dan deviasi standar jarak dari sentroid ke tepi area. Secara matematis, sifat bundar dinyatakan sebagai berikut:

𝑐 =𝜇𝑅

𝜎𝑅 (12.4)

Dalam hal ini, r berupa 𝜇𝑅 = 1

𝑁∑ |(𝑦𝑖, 𝑥𝑖) − (𝑦̅𝑐, 𝑥̅𝑐)| 𝑁

𝑖 =1 (12.5)

(17)

𝜎𝑅 = 1

𝑁∑ [ |(𝑦𝑖, 𝑥𝑖) − (𝑦̅𝑐, 𝑥̅𝑐)| − 𝜇𝑅 ] 2 𝑁

𝑖 =1 (12.6)

Contoh fungsi berikut dimaksudkan untuk memperoleh fitur sifat bundar. Fungsi memerlukan masukan berupa citra biner.

function [c] = sifatbundar(BW)

% SIFATBUNDAR Digunakan untuk memperoleh fitur sifat bundar. % Masukan: BW adalah citra biner.

[px, py] = centroid(BW);

[m, n] = size(BW);

Kontur = inbound_tracing(BW); % Hapus elemen terakhir

Kontur(length(Kontur),:) = []; jum =length(Kontur); % Hitung mu total = 0; for i=1 : jum

total = total + sqrt( (Kontur(i,1)-py)^2 + ... (Kontur(i,2)-px)^2); end mu = total / jum; % Hitung sigma total = 0;

for i=1 : jum

total = total + (sqrt( (Kontur(i,1)-py)^2 + ...

(Kontur(i,2)-px)^2) - mu) ^ 2; end

sigma = total / jum;

c = mu / sigma;

Akhir Program

(18)

Contoh pemakaian fungsi sifatbundar:

>> Img = im2bw(imread('C:\Image\guppi-1.png'), 0.5);  >> c = sifatbundar(Img) 

c = 0.10620 >>

Fungsi im2bw diperlukan jika citra tidak berupa citra biner. Tabel 12.1 memperlihatkan berbagai objek dan nilai sifat bundarnya.

Tabel 12.1 Sifat bundar berbagai objek

Objek Nilai Sifat Bundar

ikan-1.png 0,20595 ikan-2.png 0,20595 ikan-3.png 0,31363 ikan-4.png 0,21497 ikan-5.png 0,22230 guppi-1.png 0,10620 kunci.png 0,10110

(19)

12.5 Convex Hull dan Soliditas

Convex hull dengan menggunakan morfologi telah dibahas di Bab 7. Namun, hasilnya belum seperti yang diharapkan. Convex hull yang ideal adalah seperti karet gelang yang dipasang di tepi objek. Gambar menunjukkan bentuk konveks dan tidak konveks. Suatu himpunan S di dalam bidang  dinamakan konveks jika di seluruh pasangan dua titik yang terkandung di dalamnya dibentuk oleh garis yang seluruhnya berada dalam S. Dengan demikian, Gambar 12.8(b) bukanlah bentuk konveks karena garis contoh menghasilkan titik di luar objek.

(a) Himpunan konveks (b) Bukan Himpunan konveks

Gambar 12.8 Konveks dan bukan konveks

Salah satu algoritma yang digunakan untuk menangani perwujudan convex hull adalah ‘Graham Scan’. Algoritma ini sangat efisien untuk menangani convex hull baik untuk kurva tertutup ataupun piksel-piksel yang tersebar secara individual, berapa pun jumlahnya (Goodrich dan Tamassia, 2002). Kinerjanya sebesar O(n log n), dengan n adalah jumlah piksel yang akan dilingkupi oleh sabuk. Tabel 12.2 menunjukkan berbagai algoritma yang berhubungan dengan convex hull. Beberapa algoritma dibahas oleh O’Rourke (1995).

(20)

Tabel 12.2 Berbagai algoritma convex hull

Algoritma Kinerja Penemu

Brute Force O(n4) dan O(n3) Tidak diketahui Graham Scan O(n log n) Graham, 1972 Gift Wrapping O(nh) Jarvis, 1973

QuickHull O(nh) Eddy, 1977

Divide-and-Conquer O(n log n) Preparata & Hong, 1977 Monotone Chain O(n log n) Andrew, 1979

Incremental O(n log n) Kallay, 1984

Marriage-before-Conquest

O(n log h) Kirkpatrick & Seidel, 1986

Dasar untuk memperoleh convex hull pada algoritma Graham Scan dibagi menjadi tiga tahap.

1. Perolehan titik p0 di dalam himpunan P yang berisi kumpulan titik. Titik p0 ini biasa disebut sebagai titik jangkar atau pivot. Caranya adalah dengan mencari titik yang mempunyai nilai ordinat Y terkecil. seandainya terdapat beberapa nilai Y yang memenuhi hal itu, dicari nilai X yang paling kecil. 2. Penghitungan sudut semua titik di dalam P, selain p0 terhadap p0.

Kemudian, semua titik di dalam P selain p0 diurutkan secara radial berlawanan dengan arah jarum jam.

(Titik jangkar) p0

Gambar 12.9 Penyiapan piksel di dalam convex hull secara radial berdasarkan titik jangkar

(21)

3. Penyiapan sebuah tumpukan. Titik p0 dan titik pertama hasil pengurutan diletakkan ke dalam tumpukan H. Kemudian, setiap titik tersisa pi diproses dengan cara seperti berikut.

(a) Jika pi membentuk putaran ke kiri terhadap dua titik yang berada di dalam tumpukan H, tambahkan pi ke H dan lanjutkan pemrosesan untuk titik berikutnya.

(b) Untuk keadaan sebaliknya, ambil satu data dari tumpukan H.

Algoritma Graham Scan dapat dilihat berikut ini.

ALGORITMA 12.1 – Algoritma ‘Graham Scan’

Masukan:

 P = n piksel Keluaran:

 Himpunan convex hull GrahamScan(BW):

1. P0 Titik jangkar

2. P  P0, P1, P2, P3,…,Pn-1 dengan P1 hingga Pn-1 telah diurutkan secara radial. Selanjutnya, P akan diindeks dari 1 sampai dengan n 3. H  Stack kosong 4. Push(H, p0) 5. Push(H, p1) 6. i  2 7. WHILE i < n pa puncak H pb puncak H IF pi berputar ke kanan(Pa, Pb) Pop(H) ELSE Push(H, Pi) i  i + 1 END END 8. RETURN H

(22)

Gambar 12.10 memperlihatkan contoh pembentukan convex hull dengan algoritma di atas. Gambar 12.10(a) menunjukkan keadaan awal ketika dua titik pertama diproses diletakkan ke dalam tumpukan. Gambar 12.10(b) menunjukkan ketika titik ketiga ditambahkan sebagai bagian dari convex hull. Hal ini terjadi karena titik ketiga mengalami putaran ke kiri terhadap titik terakhir yang berada di dalam tumpukan. Gambar 12.10(d) menunjukkan hasil ketika titik kelima diproses. Perhatikan bahwa terjadi putaran ke arah kanan. Oleh karena itu, titik di puncak tumpukan dikeluarkan dan digantikan dengan titik kelima tersebut. Gambar 12.10(f) menunjukkan keadaan akhir, yaitu setelah semua titik diproses. Dalam hal ini, titik terakhir tinggal dihubungkan ke titik jangkar.

(a) (b)

(c)

(e)

(d)

(f)

Gambar 12.10 Ilustrasi pembentukan convex hull dengan menggunakan algoritma ‘Graham Scan’

(23)

Dalam praktik, algoritma perlu dikembangkan lagi untuk mengantisipasi keadaan sejumlah titik yang mempunyai sudut sama tetapi memiliki panjang yang berbeda terhadap titik jangkar (Gambar 12.11(a)). Tujuannya adalah untuk mempercepat proses pemindaian saat membentuk convex hull. Dalam keadaan seperti itu, hanya titik dengan panjang yang terbesar yang dipertahankan. Implementasi pembentukan convex hull dengan memperhatikan hal seperti itu dapat dilihat pada fungsi convexhull.

(a) (b)

Dua titik mempunyai sudut yang sama

Titik dengan jarak terpanjang dipertahankan

Gambar 12.11 Penghilangan titik-titik yang mempunyai sudut sama, dengan hanya mempertahankan satu saja yang terpanjang

function [CH] = convexhull2(Kontur)

% CONVEXHULL Digunakan untuk mendapatkan convex hull % dari suatu objek menggunakan metode 'Graham Scan'. % Masukan: Kontur = kontur objek, yamg berdimensi dua % dengan kolom pertama berisi data Y dan

% kolom kedua berisi data X. % Keluaran: CH = Convex hull

jum = length(Kontur);

% Cari titik jangkar atau pivot terkecil = 1;

for i=2 : jum

if Kontur(i,1) == Kontur(terkecil, 1) if Kontur(i,2) < Kontur(terkecil, 2)

(24)

terkecil = i; else if Kontur(i,1) < Kontur(terkecil, 1) terkecil = i; end end end end

% Susun data dengan menyertakan sudut dan panjang, % kecuali titik dengan posisi = terkecil

indeks = 0; for i=1 : jum

if i == terkecil continue; end indeks = indeks + 1; Piksel(indeks).y = Kontur(i, 1); Piksel(indeks).x = Kontur(i, 2); Piksel(indeks).sudut = sudut(Kontur(terkecil,:), ... Kontur(i,:)); Piksel(indeks).jarak = jarak(Kontur(terkecil,:), ... Kontur(i,:)); end jum_piksel = indeks;

% Lakukan pengurutan menurut sudut dan jarak for p = 2: jum_piksel

x = Piksel(p);

% Sisipkan x ke dalam data[1..p-1] q = p - 1;

ketemu = 0;

while ((q >= 1) && (~ketemu)) if x.sudut < Piksel(q).sudut Piksel(q+1) = Piksel(q); q = q - 1; else ketemu = 1; end Piksel(q+1) = x; end end

% Kalau ada sejumlah piksel dengan nilai sudut sama % maka hanya yang jaraknya terbesar yang akan % dipertahankan Piksel = unik(Piksel); jum_piksel = length(Piksel); % Siapkan tumpukan H = []; top = 0; % Proses pemindaian

(25)

% Mula-mula sisipkan dua titik top = top + 1; H(top).y = Kontur(terkecil, 1); H(top).x = Kontur(terkecil, 2); top = top + 1; H(top).y = Piksel(1).y; H(top).x = Piksel(1).x; i=2; while i <= jum_piksel titik.x = Piksel(i).x; titik.y = Piksel(i).y;

% Ambil dua data pertama pada tumpukan H % tanpa membuangnya A.x = H(top).x; A.y = H(top).y; B.x = H(top-1).x; B.y = H(top-1).y; if berputar_ke_kanan(A, B, titik) % Pop data pada tumpukan H

top = top - 1; else

% Tumpuk titik ke tumpukan H top = top + 1; H(top).x = titik.x; H(top).y = titik.y; i=i+1; end end

% Ambil data dari tumpukan H C = [];

indeks = 0; while top ~= 0

indeks = indeks + 1;

% Pop data dari tumpukan H C(indeks,2) = H(top).x; C(indeks,1) = H(top).y; top = top - 1; end % Balik urutannya for i=1 : indeks

CH(indeks+1-i,1) = C(i,1); CH(indeks+1-i,2) = C(i,2); end function [s] = sudut(T1, T2) dy = T1(1,1)-T2(1,1); dx = T1(1,2)-T2(1,2); if dx == 0

(26)

dx = 0.00000001; end s = atan(dy / dx); if s < 0 s = s + pi; end function [j] = jarak(T1, T2) j = (T1(1,1)-T2(1,1))^2 + (T1(1,2)-T2(1,2))^2;

function [stat] = berputar_ke_kanan(p1, p2, p3) stat = ((p2.x - p1.x) * (p3.y - p1.y) - ... (p3.x - p1.x) * (p2.y - p1.y)) > 0; function [P] = unik(Piksel) jum = length(Piksel); sudut = -1;

% Tandai jarak dengan -1

% kalau titik tidak terpakai for i=1 : jum

if sudut ~= Piksel(i).sudut sudut = Piksel(i).sudut; jarak = Piksel(i).jarak; else if jarak < Piksel(i).jarak Piksel(i).jarak = -1; end end end indeks = 0; for i=1 : jum

if Piksel(i).jarak ~= -1 indeks = indeks + 1; P(indeks) = Piksel(i); end end Akhir Program

Kode penting yang perlu diperhatikan pada fungsi di atas adalaj pada fungsi berputar_ke_kanan. Fungsi itulah yang berperan untuk menentukan suatu titik berada di kiri atau di kanan suatu garis dan tentu saja dapat digunakan untuk menentukan arah putaran. Perhitungannya dilakukan melalui:

(27)

Dalam hal ini, kemungkinan hasilnya ada tiga macam.

Kemungkinan 1: Hasil bernilai 0, yang menyatakan bahwa titik p3 terletak satu garis dengan garis yang dibentuk oleh p1 dan p2.

Kemungkinan 2: Hasil bernilai kurang dari 0, yang menyatakan bahwa titik p3 terletak di sebelah kanan garis yang dibentuk oleh p1 dan p2.

Kemungkinan 1: Hasil bernilai lebih dari 0, yang menyatakan bahwa titik p3 terletak di kiri garis yang dibentuk oleh p1 dan p2.

p2

p1

p3

(b) p3 di kanan garis. Dalam hal ini,

p2 berputar ke kiri untuk

menuju p3

p2

p1

p3

(a) p3 di kiri garis. Dalam hal ini, p2

berputar ke kanan untuk menuju p3

Gambar 12.12 Gambaran berputar ke kanan dan ke kiri

Selain itu, penanganan untuk menghapus titik yang terletak di sudut yang sama, yang diilustrasikan di depan, dilakukan oleh fungsi unik. Fungsi itulah yang menghasilkan satu titik dengan jarak terbesar sekiranya terdapat beberapa titik yang memiliki sudut yang sama.

Contoh pengujian fungsi convexhull untuk membentuk convex hull pada sejumlah titik diperlihatkan di bawah ini:

>> M = [1 1; 100 1; 100 100; 1 100; 1 10; 50 60; 34 40]  M =

1 1 100 1

(28)

100 100 1 100 1 10 50 60 34 40 >> H = convexhull(M) H = 1 1 1 100 100 100 100 1 >>

Hasil H menunjukkan bahwa semua titik pada M terlingkupi oleh sabuk yang ditentukan oleh titik-titik (1,1), (1, 100), (100, 100), dan (100, 1).

Untuk mempermudah dalam mempraktikkan fungsi convexhull, fungsi bernama tesconvex dapat digunakan. Fungsi ini mengasumsikan bahwa citra yang akan diproses memiliki objek yang mudah dibedakan dengan latarbelakangnya.

function [] = tesconvex(berkas)

% TESCONVEX Digunakan untuk membuat convex hull % pada objek.

% Masukan: Nama berkas yang berisi objek biner.

Img = im2bw(imread(berkas), 0.5e); Kontur = inbound_tracing(Img); K = convexhull(Kontur);

X = K(:,2); Y = K(:,1);

X = [X; X(1)]; % Tambahkan elemen pertama di akhir Y = [Y; Y(1)]; % Tambahkan elemen pertama di akhir imshow(1-Img);

hold on;

plot(X, Y, 'r');

(29)

hold off;

Akhir Program

Contoh penggunaan fungsi tesconvex:

>> tesconvex('C:\Image\guppi-1.png') 

Hasilnya ditunjukkan pada Gambar 12.13. Garis berwarna merah menyatakan convex hull.

Gambar 12.13 Ikan guppy dan convex hull

Terkait dengan convex hull, terdapat fitur bernama konveksitas dan soliditas (Russ, 2011). Definisinya sebagai berikut:

𝐾𝑜𝑛𝑣𝑒𝑘𝑠𝑖𝑡𝑎𝑠 = 𝑝𝑒𝑟𝑖𝑚𝑒𝑡𝑒𝑟 𝑘𝑜𝑛𝑣𝑒𝑘𝑠

𝑝𝑒𝑟𝑖𝑚𝑒𝑡𝑒𝑟 𝑜𝑏𝑗𝑒𝑘 (12.7)

𝑆𝑜𝑙𝑖𝑑𝑖𝑡𝑎𝑠 = 𝑙𝑢𝑎𝑠 𝑜𝑏𝑗𝑒𝑘

𝑙𝑢𝑎𝑠 𝑘𝑜𝑛𝑣𝑒𝑘𝑠 (12.8)

(30)

function [konv] = konveksitas(BW)

% KONVEKSITAS Berguna untuk memperoleh konveksitas objek. % Masukan: BW = Citra biner yang berisi objek.

% Keluaran: konv = nilai konveksitas Kontur = inbound_tracing(BW); CHull = convexhull(Kontur); X = CHull(:,2); Y = CHull(:,1); X = [X; X(1)]; Y = [Y; Y(1)]; perimeter_objek = perim2(BW);

% Hitung perimeter konveks perimeter_konveks = 0; for i=2 : length(X)

perimeter_konveks = perimeter_konveks + ... sqrt((X(i)-X(i-1))^2 + (Y(i)-Y(i-1))^2); end

% Peroleh rasio

konv = perimeter_konveks / perimeter_objek;

Akhir Program

Pada skrip di atas, perimeter objek dihitung dengan memanfaatkan fungsi perim2, yang telah dibahas di Bab 8. Perhitungan perimeter convex hull dilaksanakan dengan menjumlahkan jarak antardua titik.

Contoh penggunaan fungsi konveksitas:

>> Img2 = im2bw(imread('C:\Image\kunci.png'), 0.5);  >> konveksitas(Img2) 

ans = 0.73520 >>

Fungsi berikut berguna untuk mendapatkan soliditas.

(31)

function [sol] = soliditas(BW)

% SOLIDITAS Berguna untuk memperoleh konveksitas objek. % Masukan: BW = Citra biner yang berisi objek. % Keluaran: konv = nilai soliditas

Kontur = inbound_tracing(BW); CHull = convexhull(Kontur); X = CHull(:,2); Y = CHull(:,1); X = [X; X(1)]; Y = [Y; Y(1)];

% Hitung luas poligon yang dibentuk oleh convex hull sigmaA = 0;

sigmaB = 0;

for i=2 : length(X)

sigmaA = sigmaA + Y(i)*X(i-1); sigmaB = sigmaB + X(i)*Y(i-1); end

delta = sigmaA - sigmaB;

luas_konveks = abs(delta / 2.0);

luas_objek = luas2(BW);

% Peroleh rasio

sol = luas_objek / luas_konveks;

Akhir Program

Perhitungan luas objek dilakukan dengan memanfaatkan fungsi luas2, yang telah dibahas di Bab 8. Perhitungan luas daerah convex hull dilakukan dengan memanfaatkan piksel-piksel yang membentuk convex hull. Algoritmanya seperti berikut (http://www.wikihow.com/Calculate-the-Area-of-a-Polygon).

ALGORITMA 12.1 – Menghitung luas poligon

Masukan:

 P = Piksel-piksel yang menyusun poligon yang telah tersusun urut berlawanan arah jarum jam.

Keluaran:

(32)

 Luas poligon luasPoligon(P):

1. Tambahkan elemen pertama sebagai elemen terakhir pada P. 2. Lakukan penjumlahan terhadap semua perkalian antara nilai

X dengan nilai Y milik piksel berikutnya. Hasilnya berupa sigmaA.

3. Lakukan penjumlahan terhadap semua perkalian antara nilai Y dengan nilai X milik piksel berikutnya. Hasilnya berupa sigmaB.

4. delta  sigmaA – sigmaB 5. luas = |delta/2|

6. RETURN luas

Ilustrasi perkalian untuk mendapatkan sigmaA dan sigmaB ditunjukkan pada Gambar 12.14. (X, Y) (a, b) (c, d) (e, f) (g, h) (a, b) S a m a (a, b) (c, d) (e, f) (g, h) (a, b) (X, Y) sigma A = a x d + c x f + e x h + g x b (a, b) (c, d) (e, f) (g, h) (a, b) (X, Y) sigma B = b x c + d x e + f x g + h x a

Luas = |(sigma A – sigma B)/2| sigma A = a x d + c x f + e x h + g x b

Gambar 12.14 Ilustrasi perkalian untuk mendapatkan sigma A dan sigma B

Contoh penggunaan fungsi soliditas:

(33)

>> soliditas(Img2)  ans = 0.79644

>>

Contoh penerapan fitur konveksitas dan soliditas pada sejumlah objek dapat dilihat pada Tabel 12.3.

Tabel 12.3 Fitur yang memanfaatkan convex hull

Objek Konveksitas Soliditas

ikan-1.png 0.8930 0.8577 ikan-2.png 0.8930 0.8577 ikan-3.png 0.8925 0.8546 ikan-4.png 0.8840 0.8582 ikan-5.png 0.8276 0.8514 guppi-1.png 0.7876 0.7964 kunci.png 0.7352 0.7147

(34)

12.6 Proyeksi

Proyeksi citra adalah bentuk satu dimensi isi citra yang dihitung berdasarkan sumbu koordinat. Definisinya sebagai berikut:

𝑃ℎ𝑜𝑟(𝑏) = ∑𝑁 𝐼(𝑏, 𝑘𝑗)

𝑗=1 (12.9)

𝑃𝑣𝑒𝑟(𝑘) = ∑𝑀𝑗=1𝐼(𝑏𝑘, 𝑘) (12.10)

Dalam hal ini, M adalah tinggi citra dan N adalah lebar citra. Definisi di atas menyatakan bahwa proyeksi horizontal Phor(b) adalah jumlah nilai piksel pada baris b citra, sedangkan Pver(k) adalah jumlah nilai piksel pada kolom k citra.

Contoh fungsi untuk menangani proyeksi dapat dilihat di bawah ini.

function [ProyHor, ProyVer]= proyeksi(F)

% PROYEKSI Memperoleh proyeksi vertikal dan horizontal. % Masukan: F = Citra berskala keabuan

% Keluaran: ProyHor = Proyeksi horizontal % ProyVer = Proyeksi vertikal [m, n] = size(F); ProyHor = zeros(m,1); ProyVer = zeros(n,1); for y=1 : m for x=1 : n

ProyHor(y) = ProyHor(y) + F(y,x); ProyVer(x) = ProyVer(x) + F(y,x); end

end

Akhir Program

Contoh penggunaan fungsi proyeksi:

>> Img2 = im2bw(imread('c:\Image\abjad.png'), 0.5);  >> [V, H] = proyeksi(Img2); 

(35)

>>

Untuk mengamati V dan H, perintah bar dapat digunakan, misalnya bar(H). Gambar 12.15 menunjukkan hasil penyajian proyeksi vertikal dan horizontal.

Proyeksi horizontal

Proyeksi vertikal

Gambar 12.15 Visualisasi proyeksi horizontal dan vertikal

Proyeksi biasa digunakan untuk identifikasi tulisan. Tammami, dkk. (2011) memanfaatkan proyeksi vertikal bersama sejumlah fitur lain untuk mengenali tulisan Arab. Pada Gambar 12.15, terlihat bahwa proyeksi horizontal dapat digunakan untuk mengidentifikasi baris tulisan. Jeda yang panjang menunjukkan pergantian baris (lihat Gambar 12.15). Burger dan Burke (2008) mengemukakan bahwa untuk mengantisipasi tulisan yang bersumbu miring, proyeksi dapat dilakukan melalui sumbu utama. Bahkan, dengan menggunakan sentroid sebagai referensi, dimungkinkan untuk menghasilkan vektor yang tidak bergantung pada rotasi.

(36)

12.7 Momen Spasial dan Momen Pusat

Momen spasial orde (m,n) didefinisikan sebagai berikut:

𝑀𝑖𝑗 = ∑𝑀𝑥 =1∑𝑁𝑦=1𝑥𝑖𝑦𝑗𝐼(𝑥, 𝑦) (12.11)

Dalam hal ini,

a) i, j = 0, 1, 2, …, dengan i j menyatakan orde momen; b) M menyatakan jumlah kolom pada citra;

c) N menyatakan jumlah baris pada citra; d) x adalah ordinat piksel;

e) y adalah absis piksel;

f) I(x,y) menyatakan intensitas piksel pada posisi (x,y).

Adapun momen pusat adalah momen spasial yang dihitung relatif terhadap pusat massa. Jika pusat massa adalah (𝑦̅, 𝑥̅), momen pusat ditulis seperti berikut:

𝜇𝑖𝑗 = ∑ ∑𝑁 (𝑥 − 𝑥̅)𝑖

𝑦=1 (𝑦 − 𝑦̅)𝑗𝐼(𝑥, 𝑦) 𝑀

𝑥=1 (12.12)

Momen di atas bersifat invariant (tidak terpengaruh) terhadap translasi. Dalam hal ini, 𝑥̅ dan 𝑦̅ diperoleh melalui:

𝑥̅ =𝑀10

𝑀00, 𝑦̅ = 𝑀01

𝑀00 (12.13)

Agar momen pusat bersifat bebas terhadap translasi, penyekalaan, dan rotasi, maka momen perlu dinormalisasi. Momen pusat ternormalisasi berupa:

ŋ𝑖𝑗 = 𝜇𝑝𝑞

𝜇𝛾00, 𝛾 = 𝑖 +𝑗+2

2 (12.14)

Implementasi moment pusat yang ternormalisasi, moment pusat, dan momen spasial dapat dilihat pada fungsi normomen, momen_pusat, dan momen_spasial berikut.

(37)

function [hasil] = normomen(F, p, q)

% NORMOMEN Menghitung moment pusat ternormalisasi. % Masukan: F = Citra biner.

% p dan q = orde momen.

F = double(F);

m00 = momen_spasial(F, 0, 0); normalisasi = m00 ^ ((p+q+2)/2.0);

hasil = momen_pusat(F, p, q) / normalisasi;

Akhir Program

function [hasil] = momen_pusat(F, p, q)

% MOMEN_PUSAT Menghitung momen pusat berorde p, q [m, n] = size(F); m00 = momen_spasial(F, 0, 0); xc = momen_spasial(F, 1, 0) / m00; yc = momen_spasial(F, 0, 1) / m00; mpq = 0; for y=1 : m for x=1 : n if F(y,x) ~= 0 mpq = mpq + (x-xc)^p * (y-yc)^q; end end end hasil = mpq; Akhir Program Program : normomen.m Program : momen_pusat.m

(38)

function [hasil] = momen_spasial(F, p, q)

% MOMEN_SPASIAL Menghitung momen spasial berorde (p,q). [m, n] = size(F); momenPQ = 0; for y=1 : m for x=1 : n if F(y,x) ~= 0

momenPQ = momenPQ + x^p * y^q; end end end hasil = momenPQ; Akhir Program

Contoh pemakaian fungsi normomen:

>> Img = im2bw(imread('C:\Image\ikan-1.png'), 0.5);  >> normomen(Img, 1, 0) 

ans = -5.9340e-016 >>

Contoh di atas digunakan untuk memperoleh ŋ10 (momen pusat ternormalisasi orde (1,0)). Adapun momen pusat ternormalisasi untuk beberapa objek ditunjukkan pada Tabel 12.4.

Tabel 12.4 Fitur yang memanfaatkan momen pusat ternormalisasi

Objek Fitur ikan-1.png ŋ11 = -0.0024 ŋ02 = 0.04578 ŋ20 = 0.1606 ŋ03 =-5.6067e-4 ŋ30 = 0.0132 ŋ12 = -8.7615e-4 ŋ21 = 0.0024 Program : momen_spasial.m

(39)

ikan-2.png ŋ11 = -0.0024 ŋ02 = 0.0458 ŋ20 = 0.1606 ŋ03 = -5.6067e-4 ŋ30 = 0.0132 ŋ12 = -8.7615e-4 ŋ21 = 0.0024 ikan-3.png ŋ11 = -0.0025 ŋ02 = 0.0456 ŋ20 = 0.1612 ŋ03 = -5.4819e-4 ŋ30 = 0.0132 ŋ12 = -8.8123e-4 ŋ21 = 0.0024 ikan-4.png ŋ11 = 0.0529 ŋ02 = 0.0811 ŋ20 = 0.1251 ŋ03 = 0.0031 ŋ30 = 0.0038 ŋ12 = 0.0051 ŋ21 = 0.0054 ikan-5.png ŋ11 = -0.0021 ŋ02 = 0.0463 ŋ20 = 0.1596 ŋ03 = -5.0026e-4 ŋ30 = 0.0135 ŋ12 = -0.0010 ŋ21 = 0.0023 guppi-1.png ŋ11 = 0.0370 ŋ02 = 0.0706 ŋ20 = 0.1671 ŋ03 = 0.0104 ŋ30 = -0.0449 ŋ12 = 0.0080 ŋ21 = -0.0109 kunci.png ŋ11 = -0.0032 ŋ02 = 0.2029 ŋ20 = 0.0796 ŋ03 = -0.0268 ŋ30 = -0.0016 ŋ12 = 0.0012 ŋ21 = 0.0221

Hasil di Tabel 12.4 menunjukkan bahwa momen pusat ternormalisasi memberikan hasil yang berbeda saat ikan diputar (ikan-4.png). Namun, translasi ataupun pengecilan menghasilkan nilai yang hampir sama. Untuk objek yang berbeda, terdapat perbedaan yang cukup nyata.

12.8 Momen Invariant

Fitur momen invariant bermanfaat untuk menyatakan objek dengan memperhitungkan area objek. Fitur ini menggunakan dasar momen pusat yang ternormalisasi. Momen yang dihasilkan dapat digunakan untuk menangani translasi, penyekalaan, dan rotasi gambar. Penciptanya, Hu (Theodoridis dan Koutroumbas, 2006), menciptakan tujuh momen invariant seperti berikut.

1 = ŋ20 + ŋ02

2 = (ŋ20− ŋ02)2+ (2ŋ 02)2

(40)

3 = (ŋ30 − 3ŋ12)2 + (ŋ 03− 3ŋ21)2 (12.15) ∅4 = (ŋ30 + ŋ12)2+ (ŋ 03 + ŋ21)2 ∅5 = (ŋ30− 3ŋ12)(ŋ30+ ŋ12)[(ŋ30+ ŋ12)2− 3(ŋ 21+ ŋ03)2] + (ŋ03− 3ŋ12)(ŋ03+ ŋ21)[(ŋ03+ ŋ12)2 − 3(ŋ 12+ ŋ30)2] ∅6 = (ŋ20 − ŋ02)[(ŋ30+ ŋ12)2− (ŋ 21+ ŋ03)2] + 4ŋ1130+ ŋ12)(ŋ03+ ŋ21) ∅7 = (3ŋ21− ŋ03)(ŋ30+ ŋ12)[(ŋ30+ ŋ12)2− 3(ŋ21+ ŋ03)2] (ŋ30− 3ŋ12)(ŋ21+ ŋ03)[(ŋ03+ ŋ21)2 − 3(ŋ 30+ ŋ12)2]

Implementasi untuk menghitung ketujuh momen Hu ditunjukkan di bawah ini.

function [Momen] = momenhu(F) % MOMENHU Menghitung momen HU.

% Masukan: F = citra berskala keabuan % Keluaran: Momen = 7 momen Hu

norm_20 = normomen(F, 2, 0); norm_02 = normomen(F, 0, 2); norm_11 = normomen(F, 1, 1); norm_30 = normomen(F, 3, 0); norm_12 = normomen(F, 1, 2); norm_21 = normomen(F, 2, 1); norm_03 = normomen(F, 0, 3);

Momen.m1 = norm_20 + norm_02;

Momen.m2 = (norm_20 - norm_02)^2 + 4 * norm_11^2;

Momen.m3 = (norm_30 + 3 * norm_12)^2 + ... (3 * norm_21 - norm_03)^2;

Momen.m4 = (norm_30 + norm_12)^2 + (norm_21 + norm_03)^2;

(41)

Momen.m5 = (norm_30 - 3 * norm_12) * ... (norm_30 + norm_12) * ...

((norm_30 + norm_12)^2 - 3 * ... (norm_21 + norm_03)^2) + ...

(3 * norm_21 - norm_03) * (norm_21 + norm_03) * ... (3 * (norm_30 + norm_12)^2 -(norm_21 + norm_03)^2);

Momen.m6 = (norm_20 - norm_02) * ... ((norm_30 + norm_12)^2 - ... (norm_21 + norm_03)^2) + ...

4 * norm_11 * (norm_30 + norm_12) * ... (norm_21 + norm_03);

Momen.m7 = (3 * norm_21 + norm_30) * ... (norm_30 + norm_12) * ...

((norm_30 + norm_12)^2 - 3 * ... (norm_21 + norm_03)^2) + ... (norm_30 - 3 * norm_12) * ... (norm_21 + norm_03) * ...

(3 * (norm_30 + norm_12)^2 - (norm_21 + norm_03)^2);

Akhir Program

Contoh penggunaan fungsi momenhu:

>> format('long'); 

>> Img = im2bw(imread('C:\Image\guppi-1.png'),0.5);  >> X = momenhu(Img) 

X =

scalar structure containing the fields:

m1 = 0.237749187513244 m2 = 0.0147674602596600 m3 = 0.00229069589208390 m4 = 0.00135857111738100 m5 = 3.52803525223293e-006 m6 = 1.33488327285475e-004 m7 = 4.00783048172902e-006 >>

(42)

Contoh hasil perhitungan ketujuh momen Hu untuk sejumlah objek dapat dilihat di Tabel 12.5. Di tabel tersebut terlihat bahwa penyekalaan, transalasi, dan rotasi pada ikan menghasilkan nilai-nilai yang hampir sama.

Tabel 12.5 Fitur yang memanfaatkan momen Hu

Objek Fitur ikan-1.png ∅1 = 0.206371 ∅2 = 0.013207 ∅3 = 0.000172 ∅4 = 0.000155 ∅5 = 0.000000034 ∅6 = 0.000016756 ∅7 = 0.000000049 ikan-2.png ∅1 = 0.206370 ∅2 = 0.013207 ∅3 = 0.000172 ∅4 = 0.000155 ∅5 = 0.000000034 ∅6 = 0.000016756 ∅7 = 0.000000049 ikan-3.png ∅1 = 0.206774 ∅2 = 0.013390 ∅3 = 0.000173 ∅4 = 0.000156 ∅5 = 0.000000035 ∅6 = 0.000017012 ∅7 = 0.000000050 ikan-4.png ∅1 = 0.2062254 ∅2 = 0.0131368 ∅3 = 0.0005498 ∅4 = 0.0001549 ∅5 = 0.000000034 ∅6 = 0.000016712 ∅7 = -0.000000042 ikan-5.png ∅1 = 0.2058433 ∅2 = 0.0128627 ∅3 = 0.0001610 ∅4 = 0.0001575 ∅5 = 0.000000036 ∅6 = 0.000016946 ∅7 = 0.000000050 guppi-1.png ∅1 = 0.2377492 ∅2 = 0.0147675 ∅3 = 0.0022907 ∅4 = 0.0013586 ∅5 = 0.000003528 ∅6 = 0.000133488 ∅7 = 0.000004008 kunci.png ∅1 = 0.2824261 ∅2 = 0.0152452 ∅3 = 0.0086765 ∅4 = 0.0000221 ∅5 = 0.000000009 ∅6 = 0.000002673 ∅7 = 0.000000001

12.9 Momen Jarak ke Pusat

Apabila objek berupa kontur saja (misalnya berupa bentuk suatu pulau), momen dapat dihitung melalui jarak titik pada kontur terhadap pusat massa (Rangayyan, 2005). Dalam hal ini, momen ke-p untuk sederet jarak d(n) didefinisikan sebagai berikut:

(43)

𝑚𝑝= 1

𝑁∑ |𝑑(𝑛)| 𝑝 𝑁

𝑖 =1 (12.16)

Momen pusat ke-p didefinisikan sebagai berikut:

𝑀𝑝= 1 𝑁∑ |𝑑(𝑛) − 𝑚1)| 𝑝 𝑁 𝑖 =1 (12.17)

Selanjutnya, momen-momen yang ternormalisasi didefinisikan sebagai

𝑚̅̅̅̅ =𝑝 𝑚𝑝 (𝑀2)𝑝/2 (12.18) 𝑀𝑝 ̅̅̅̅ = 𝑀𝑝 (𝑀2)𝑝/2 (12.19)

Menurut Gupta dan Srinath (Rangayyan, 2005), momen ternormalisasi 𝑚𝑝 dan 𝑚𝑝 bersifat bebas terhadap penyekalaan, rotasi, maupun translasi. Namun, mengingat momen berorde tinggi peka terhadap derau, mereka menganjurkan tiga fitur yang didefinisikan seperti berikut:

𝐹1 =√𝑀2 𝑚1 = √1 𝑁∑ |𝑑(𝑛)−𝑚1)| 2 𝑁 𝑖=1 1 𝑁∑ 𝑑(𝑛) 𝑁 𝑖=1 (12.20) 𝐹2 = 𝑀3 (𝑀2) 3 2 = 1 𝑁∑ |𝑑(𝑛)−𝑚1)| 3 𝑁 𝑖=1 {1 𝑁∑ |𝑑(𝑛)−𝑚1)| 2 𝑁 𝑖=1 } 3/2 (12.21) 𝐹3 = 𝑀4 (𝑀2)2= 1 𝑁∑ |𝑑(𝑛)−𝑚1)| 4 𝑁 𝑖=1 {1 𝑁∑ |𝑑(𝑛)−𝑚1)| 2 𝑁 𝑖=1 } 2 (12.22)

Menurut Rangayyan (2005), studi yang dilakukan oleh Shen, dkk. menunjukkan bahwa F2 dan F3 tidak menunjukkan perbedaan yang signifikan untuk bentuk yang berbeda dan F2 ternyata berubah secara nyata terhadap penyekalaan dan rotasi. Oleh karena itu, mereka melakukan modifikasi terhadap F2 dan F3 sebagai berikut:

𝐹2= 3√𝑀3 𝑚1 = √1 𝑁∑ |𝑑(𝑛)−𝑚1)| 3 𝑁 𝑖=1 3 1 𝑁∑ 𝑑(𝑛) 𝑁 𝑖=1 (12.23) 𝐹3′ = 4√𝑀4 𝑚1 = √1 𝑁∑ |𝑑(𝑛)−𝑚1)| 4 𝑁 𝑖=1 4 1 𝑁∑ 𝑑(𝑛) 𝑁 𝑖=1 (12.24)

Fakta yang menarik, kumpulan fitur {F1, F2’, F3’} mempunyai sifat-sifat seperti berikut (Rangayyan, 2005).

(44)

 Semua fitur dapat diperbandingkan secara langsung.

 F3’ menyatakan kekasaran kontur yang lebih baik daripada F3. Semakin besar nilai, semakin besar kekasaran kontur.

Temuan yang juga menarik, menurut Rangayyan, kombinasi mf = F3’ – F1 merupakan indikator yang bagus untuk mengungkapkan kekasaran bentuk.

Fungsi mjarakpusat berikut merupakan implementasi untuk menghitung fitur-fitur yang telah dijelaskan di atas.

function [Fitur] = mjarakpusat(F)

% FJARAKPUSAT Menghitung fitur momen jarak ke pusat. % Masukan: F = Citra biner.

% p = Orde momen

% Keluaran: Fitur = fitur citra

Fitur.F1 = sqrt(momen_pusat_ke_p(F, 2)) / momen_ke_p(F, 1); Fitur.F2 = momen_pusat_ke_p(F, 3) / (momen_ke_p(F, 2)^1.5); Fitur.F3 = momen_pusat_ke_p(F, 4) / (momen_ke_p(F, 2)^2);

Fitur.F2a = momen_pusat_ke_p(F, 3)^(1/3) / momen_ke_p(F, 1); Fitur.F3a = momen_pusat_ke_p(F, 4)^(1/4) / momen_ke_p(F, 1);

Fitur.mf = Fitur.F3a - Fitur.F1;

function [momen] = momen_pusat_ke_p(F, p) momen_p = momen_ke_p(F, p); momen_1 = momen_ke_p(F, 1); Kontur = inbound_tracing(F); [m, n] = size(F); [xp, yp] = centroid(F); jum = length(Kontur);

% Hitung momen pusat ke-p momen = 0;

for i=1 : jum

jarak = sqrt((Kontur(i,2)-xp)^2 + (Kontur(i,1)-yp)^2);

momen = momen + abs(jarak - momen_1) ^ p; end

momen = momen / jum;

(45)

function [momen] = momen_ke_p(F, p) % Hitung momen ke-p

Kontur = inbound_tracing(F); [m, n] = size(F); [xp, yp] = centroid(F); jum = length(Kontur); momen = 0;

for i=1 : jum

jarak = sqrt((Kontur(i,2)-xp)^2 + (Kontur(i,1)-yp)^2); momen = momen + jarak ^ p;

end

momen = momen / jum;

Akhir Program

Contoh penggunaan fungsi mjarakpusat:

>> Img = im2bw(imread('C:\Image\kunci.png'), 0.5);  >> mjarakpusat(Img) 

ans =

scalar structure containing the fields:

F1 = 0.358466495430004 F2 = 0.0501126615340028 F3 = 0.0239217027470453 F2a = 0.391651322336318 F3a = 0.417780786529233 mf = 0.0593142910992286 >>

Contoh hasil perhitungan momen jarak ke pusat untuk sejumlah objek dapat dilihat pada Tabel 12.6. Pada tabel tersebut terlihat bahwa penyekalaan, transalasi, dan rotasi pada ikan menghasilkan nilai yang hampir sama.

(46)

Tabel 12.6 Fitur momen ke jarak pusat Objek Fitur ikan-1.png F1 = 0.2526 F2 = 0.0195 F3 = 0.0070 F2’ = 0.2776 F3’ = 0.2988 Mf = 0.0463 ikan-2.png F1 = 0.2526 F2 = 0.0195 F3 = 0.0070 F2’ = 0.2776 F3’ = 0.2988 Mf = 0.0463 ikan-3.png F1 = 0.2542 F2 = 0.0199 F3 = 0.0073 F2’ = 0.2796 F3’ = 0.3012 Mf = 0.0470 ikan-4.png F1 = 0.2484 F2 = 0.0189 F3 = 0.0069 F2’ = 0.2744 F3’ = 0.2969 Mf = 0.0485 ikan-5.png F1 = 0.2422 F2 = 0.0173 F3 = 0.0059 F2’ = 0.2658 F3’ = 0.2857 Mf = 0.0434 guppi-1.png F1 = 0.3372 F2 = 0.0541 F3 = 0.0322 F2’ = 0.3991 F3’ = 0.4469 Mf = 0.1096 kunci.png F1 = 0.3585 F2 = 0.0501 F3 = 0.0239 F2’ = 0.3917 F3’ = 0.4178 Mf = 0.0593 12.10 Momen Zernike

Momen Zernike diperkenalkan oleh F. Zernike dalam bukunya berjudul Physica yang diterbitkan pada tahun 1934. Penerapan momen Zernike untuk pengolahan citra diperkenalkan pertama kali oleh M.R. Teague pada tahun 1980 (Chen, dkk., 2005). Hasilnya berupa Zernike moment descriptors (ZMD). Momen ini mempunyai kelebihan seperti berikut (Migquiang, dkk., 2008):

 bersifat independen terhadap pemutaran (rotasi);

 andal terhadap derau dan variasi minor dalam bentuk objek;  memiliki redundansi informasi yang minimum.

(47)

Walaupun begitu, momen ini memiliki kelemahan seperti berikut.

 perlu normalisasi ruang koordinat (dalam hal ini, harus dilakukan pengubahan ke bentuk lingkaran x2 + y2 < 1).

 perlu penggunaan hampiran penjumlahan mengingat aslinya menggunakan integral. Hal ini berkontribusi dalam memberikan kesalahan numerik, yang memberikan pengaruh terhadap sifat ketidakbergantungan pada rotasi.  perlu dilakukan normalisasi terhadap translasi dan penyekalaan mengingat

momen Zernike tidak bebas dari penggeseran dan penyekalaan.

Momen Zernike didasarkan pada polinomial Zernike yang bersifat ortogonal terhadap lingkaran x2 + y2 < 1, yang dinyatakan sebagai berikut:

𝑉𝑝𝑞(𝑥, 𝑦) = 𝑈𝑝𝑞(𝑟 𝑐𝑜𝑠𝜃, 𝑟 sin 𝜃) = 𝑅𝑝𝑞(𝑟). exp (𝑗𝑞𝜃) (12.25)

dengan 𝑟 adalah radius dari (y,x) ke pusat massa (centroid), 𝜃 adalah sudut antara r dan sumbu x (lihat Gambar 12.26), dan Rpq(r) adalah polinomial radial ortogonal seperti berikut: 𝑅𝑝𝑞(𝑟) = ∑ (−1)𝑠 (𝑝−𝑠)! 𝑠!(𝑝+|𝑞| 2 −𝑠) !( 𝑝−|𝑞| 2 −𝑠)! 𝜌𝑝−2𝑠 (𝑝−|𝑞 |)/2 𝑠=0 (12.26)

Dalam hal ini, n = 0,1,2,….; 0 < |q| < n, j= √−1, , dan p-|q| bernilai genap. Beberapa polinomial yang digunakan untuk memperoleh momen Zernike ditunjukkan pada Tabel 12.7 (Flusser, dkk., 2009). Polinomial Zernike hingga orde 12 dibahas pada Duin, dkk. (2007). Adapun sembilan polinomial Zernike pertama ditunjukkan pada Gambar 12.17.

(48)

Centroid

Lingkaran:

x2 + y2 < 1

r

Gambar 12.16 Citra dalam lingkaran yang memenuhi persamaan x2 + y2 < 1

Tabel 12.7 Polinomial yang digunakan pada momen Zernike 𝑅00(𝑟) = 1 𝑅66(𝑟) = 𝑟6 𝑅11(𝑟) = 𝑟 𝑅71(𝑟) = 35𝑟6 − 60𝑟5+ 30𝑟3− 4𝑟 𝑅20(𝑟) = 2𝑟2− 1 𝑅73(𝑟) = 21𝑟7 − 30𝑟5+ 10𝑟3 𝑅22(𝑟) = 𝑟2 𝑅 75(𝑟) = 7𝑟7− 6𝑟5 𝑅31(𝑟) = 3𝑟2− 2𝑟 𝑅 77(𝑟) = 7𝑟7 𝑅33(𝑟) = 𝑟3 𝑅 80(𝑟) = 70𝑟8 − 140𝑟6+ 90𝑟4 − 20𝑟2 + 1 𝑅40(𝑟) = 6𝑟4− 6𝑟2+ 1 𝑅 82(𝑟) = 56𝑟8 − 105𝑟6+ 60𝑟4 − 10𝑟2 𝑅42(𝑟) = 4𝑟4− 3𝑟2 𝑅 84(𝑟) = 28𝑟8 − 42𝑟6+ 15𝑟4 𝑅44(𝑟) = 𝑟4 𝑅 86(𝑟) = 8𝑟8− 7𝑟6 𝑅51(𝑟) = 10𝑟5− 12𝑟2 + 3𝑟 𝑅 88(𝑟) = 𝑟8 𝑅53(𝑟) = 5𝑟5− 4𝑟3 𝑅 91(𝑟) = 126𝑟9 − 280𝑟7+ 210𝑟5+ 60𝑟3 + 5𝑟 𝑅55(𝑟) = 𝑟5 𝑅 93(𝑟) = 84𝑟9− 168𝑟7+ 105𝑟5− 20𝑟3 𝑅60(𝑟) = 20𝑟6− 30𝑟4 + 12𝑟2 − 1 𝑅95(𝑟) = 36𝑟9− 56𝑟7+ 21𝑟5 𝑅62(𝑟) = 15𝑟6− 20𝑟4 + 6𝑟2 𝑅97(𝑟) = 9𝑟9− 8𝑟7 𝑅64(𝑟) = 6𝑟6− 5𝑟4 𝑅 99(𝑟) = 𝑟9

(49)

R00 R40 R11 R20 R22 R 33 R44 R42 R31

Gambar 12.17 Sembilan polinomial Zernike pertama, berdasarkan pada Tabel 12.7

Momen Zernike berorde p dengan pengulangan fungsi kontinu f(y, x) sebanyak q dinyatakan sebagai berikut:

𝑍𝑝𝑞 =𝑝+1 𝜋 ∫ ∫ 𝑓(𝑦, 𝑥). 𝑉 ∗ 𝑝𝑞(𝑦, 𝑥) 𝑑𝑦 𝑑𝑥; 𝑥2+ 𝑦2≤ 1 𝑥 𝑦 (12.27)

Dalam hal ini, V* menyatakan konjugat, sedangkan Vpq(y,x) dinamakan sebagai fungsi basis Zernike berorde p dengan pengulangan sebanyak q. Fungsi basis berupa

𝑉𝑝𝑞(𝑦, 𝑥) = 𝑉𝑝𝑞(𝜌, 𝜃) = 𝑅𝑝𝑞(𝜌). exp (𝑗𝑞𝜃) (12.28)

Dengan p berupa bilangan bulat nol atau positif dan n p-|q| bernilai genap dan |q| < p.

Apabila f(y,x) adalah citra digital, persamaan di atas dapat dihampiri dengan

(50)

𝑍𝑝𝑞 =𝑝+1 𝜋 ∑ ∑ 𝑓(𝑦, 𝑥). 𝑉 ∗ 𝑝𝑞(𝑦, 𝑥) 𝑥 𝑦 (12.29)

Gambar 12.18 menunjukkan 16 bentuk pertama fungsi Zernike.

Gambar 12.18 Enam belas fungsi Zernike yang pertama

Apabila citra diputar dengan sudut sebesar , fungsi-fungsi momen Zernike Z’ berupa

𝑍′

𝑝𝑞 = 𝑍𝑝𝑞. 𝑒−𝑗𝑞𝜑 (12.30)

Persamaan di atas menyatakan bahwa apabila besaran momen Zernike saja yang digunakan akan diperoleh fitur yang tidak bergantung pada rotasi.

Polinomial yang digunakan pada momen Zernike dapat digunakan untuk menyatakan bentuk geometrik objek. Polinomial orde rendah berguna untuk memperoleh fitur global suatu bentuk, sedangkan polinomial orde tinggi dapat menangkap rincian bentuk atau fitur lokal (Choras, 2007). Dalam praktik, pemilihan jumlah momen Zernike yang tepat perlu ditentukan. Sebagai contoh, Zhang (2002) menggunakan 36 momen untuk melakukan pencarian citra, dengan mempertimbangkan efisiensi pemrosesan dan keakuratan.

(51)

Proses untuk melakukan momen Zernike ditunjukkan pada Gambar 12.2. Pertama-tama, citra yang akan diproses perlu diubah ke bentuk biner. Kemudian, dilakukan normalisasi penyekalaan dan translasi, mengingat momen Zernike bergantung pada kedua hal tersebut. Setelah momen Zernike diperoleh, perlu dilaksanakan normalisasi agar nilainya berada antara [0 1].

Citra Biner Normalisasi Penyekalaan Normalisasi Translasi Perhitungan ZMD Normalisasi ZMD

Gambar 12.19 Mekanisme perhitungan ZMD

Normalisasi penyekalaan dilakukan didasarkan pada persamaan

𝑥′ = 𝑥 √𝑚𝛽 00, 𝑦

= 𝑦 √ 𝛽

𝑚00 (12.31)

Komponen √ 𝛽

𝑚00 adalah faktor penyekala. Dalam hal ini,  adalah suatu nilai yang telah ditentukan terlebih dulu (pada contoh di belakang,  dipilih sebesar 20000) dan m0,0 (momen spasial orde (0,0)) tidak lain adalah luas objek.

Normalisasi translasi dilakukan dengan cara menggeser pusat massa ke tengah citra. Dalam hal ini, nilai X dan Y pusat massa dihitung melalui rumus:

𝑥𝑐 =𝑚10

𝑚00, 𝑦𝑐 = 𝑚01

𝑚00 (12.32)

Pada persamaan di atas, (yc, xc) adalah sentroid, m1,0 adalah momen spasial order (1,0) dan m1,0 adalah momen spasial order (0,1). Dengan demikian, nilai x dan y baru dapat diperoleh melalui

(52)

𝑥′ = 𝑥 𝑐− 𝑁 2, 𝑦 ′= 𝑦 𝑐 − 𝑀 2 (12.33)

dengan M adalah tinggi citra dan N adalah lebar citra.

Normalisasi ZMD dilakukan dengan membagi momen citra dengan m0,0. Jadi,

𝑍𝑝𝑞′= 𝑍𝑝𝑞

𝑚00 (12.34)

Pengaturan citra ke dalam lingkaran yang memenuhi persamaan x2 + y2 < 1 dilakukan dengan membuat matriks yang berukuran sama dengan ukuran citra. Selanjutnya, absis dan ordinat dinormalisasi agar berada di dalam jangkauan [-1 1]. Hal ini dapat dilakukan melalui perintah seperti berikut:

selang = 2 / (m-1); ii = 0;

for i=-1 : selang : 1 ii = ii + 1; jj = 0; for j=-1 : selang : 1; jj = jj + 1; X(ii, jj) = j; Y(ii, jj) = i; end end

Dalam hal ini, m adalah tinggi atau lebar citra (karena tinggi dan lebar citra dibuat sama).

Berdasarkan koordinat yang tercantum dalam X dan Y di atas, posisi setiap piksel di dalam citra yang berada dalam lingkaran dapat diperoleh. Dengan demikian, informasi  dan  dapat dihitung berdasarkan posisi piksel terhadap pusat lingkaran.

(53)

function A = zermoment (F, orde, tampil)

% ZERMOMENT Menghasilkan koefisien momen Zernike. % Masukan:

% F = Citra biner

% orde = order momen Zernike

% tampil = true untuk menampilkan gambar

if nargin < 3

tampil = false; end

% Salin yang ada pada kotak pembatas

[min_x, max_x, min_y, max_y] = kotak_pembatas(F); B = F(min_y:max_y, min_x:max_x);

[m, n] = size(B);

beta = 20000; % Parameter untuk mengatur % penyekalaan citra

luas = sum(sum(B)); % Luas objek

% Tentukan citra yang memenuhi perbandingan beta % dengan luas citra B

m1 = fix(m * sqrt(beta/luas)); n1 = fix(n * sqrt(beta/luas)); C = imresize(B, [m1, n1]); [m, n] = size(C);

% Atur ukuran gambar untuk kepentingan % penyajian dalam bentuk lingkaran maks_mn = max(m, n);

m_baru = round(sqrt(2) * maks_mn); n_baru = m_baru; D = zeros(m_baru, n_baru); for i=1 : m for j=1: n D(i,j) = C(i,j); end end m = m_baru; n = n_baru;

% Peroleh pusat massa dan letakkan di tengah citra [xc, yc] = centroid(D);

xc = round(xc);

(54)

yc = round(yc); xc = xc - round((n/2)); yc = yc - round((m/2)); % Atur gambar ke G G = zeros(m,n); for i=1 : m for j=1: n if ~((j-xc< 1) || (i-yc<1) || (i-yc > m) || (j-xc > n)) G(i-yc, j-xc)= D(i,j); end end end

% Bentuk grid untuk menentukan koordinat % dengan tengah citra sebagai titik pusat selang = 2 / (m-1);

ii = 0;

for i=-1 : selang : 1 ii = ii + 1; jj = 0; for j=-1 : selang : 1; jj = jj + 1; X(ii, jj) = j; Y(ii, jj) = i; end end

% Hitung sudut, rho, dan lingkaran Theta = zeros(m, n);

Rho = zeros(m, n); L = zeros(m, n); for i=1 : m for j=1: n

Theta(i,j) = atan2(Y(i,j), X(i,j)); if Theta(i,j) < 0

Theta(i,j) = Theta(i,j) + 2 * pi; end

jarak2 = X(i,j)^2 + Y(i,j)^2; Rho(i,j) = sqrt(jarak2); L(i,j) = jarak2; end end % Bentuk lingkaran DidalamL = find(L <= 1); Lingkaran = zeros(m,n); Lingkaran(DidalamL) = 1; luas = 0; for i=1 : m for j=1: n if Lingkaran(i,j) == 1 luas = luas + 1; end end end

(55)

% Hitung Koefisien momen Zernike A = []; indeks = 0; for p = 2: orde for q = p:-2:0 zpq_real = 0; zpq_imaj = 0; for i=1 : m for j=1 : n if Lingkaran(i,j) == 1 vpq = fb_zernike(p,q, Rho(i,j));

zpq_real = zpq_real + G(i,j)* vpq * ... cos(q * Theta(i,j));

zpq_imaj = zpq_imaj + G(i,j)* vpq * ... sin(q * Theta(i,j));

end end end

zpq_real = zpq_real * (p+1)/pi; zpq_imaj = zpq_imaj * (p+1)/pi;

indeks = indeks + 1;

A(indeks) = sqrt(zpq_real^2 + zpq_imaj^2); end; end; % Normalsiasi koefisien m00 = momen_spasial(G, 0, 0); A = A ./ m00;

% Tampilkan gambar kalau memang diminta if tampil == true close all; figure; subplot(2,2,1); imshow(B);

title('Citra dalam kotak pembatas');

subplot(2,2,2); imshow(G);

title('Hasil penyekalaan dan translasi');

subplot(2,2,3);

imshow(1-Lingkaran+G);

title('Citra dalam lingkaran');

subplot(2,2,4); plot(A);

title('Deskriptor momen Zernike'); end

function p = fb_zernike (n,l,rho) % Menghitung fungsi basis Zernike

p = 0; if n == 2

(56)

switch (l) case 0, p = 2*(rho.^2)-1; case 2, p = (rho.^2); end; elseif n == 3 switch (l) case 1, p = 3*(rho.^3)-2*rho; case 3, p = (rho.^3); end; elseif n == 4 switch (l) case 0, p = 6*(rho.^4)-6*(rho.^2)+1; case 2, p = 4*(rho.^4)-3*(rho.^2); case 4, p = (rho.^4); end; elseif n == 5 switch (l) case 1, p = 10*(rho.^5)-12*(rho.^3)+3*rho; case 3, p = 5*(rho.^5)- 4*(rho.^3);

case 5, p = (rho.^5); end;

elseif n == 6 switch (l)

case 0, p = 20*(rho.^6)-30*(rho.^4)+12*(rho.^2)-1; case 2, p = 15*(rho.^6)-20*(rho.^4)+ 6*(rho.^2); case 4, p = 6*(rho.^6)- 5*(rho.^4);

case 6, p = (rho.^6); end; elseif n == 7 switch (l) case 1, p = 35*(rho.^7)-60*(rho.^5)+30*(rho.^3)-4*rho; case 3, p = 21*(rho.^7)-30*(rho.^5)+10*(rho.^3);

case 5, p = 7*(rho.^7)- 6*(rho.^5); case 7, p = (rho.^7); end; elseif n == 8 switch (l) case 0, p = 70*(rho.^8)-140*(rho.^6)+... 90*(rho.^4)-20*(rho.^2)+1; case 2, p = 56*(rho.^8)-105*(rho.^6)+ ... 60*(rho.^4)-10*(rho.^2);

case 4, p = 28*(rho.^8)- 42*(rho.^6)+15*(rho.^4); case 6, p = 8*(rho.^8)- 7*(rho.^6);

case 8, p = (rho.^8); end; elseif n == 9 switch (l) case 1, p = 126*(rho.^9)-280*(rho.^7)+ ... 210*(rho.^5)-60*(rho.^3)+5*rho; case 3, p = 84*(rho.^9)-168*(rho.^7)+ ... 105*(rho.^5)-20*(rho.^3);

case 5, p = 36*(rho.^9)- 56*(rho.^7)+ 21*(rho.^5); case 7, p = 9*(rho.^9)- 8*(rho.^7);

case 9, p = (rho.^9); end; elseif n == 10 switch (l) case 0, p = 252*(rho.^10)-630*(rho.^8)+ ... 560*(rho.^6)-210*(rho.^4)+30*(rho.^2)-1;

(57)

case 2, p = 210*(rho.^10)-504*(rho.^8)+ ... 420*(rho.^6)- ... 140*(rho.^4)+15*(rho.^2); case 4, p = 129*(rho.^10)-252*(rho.^8)+ ... 168*(rho.^6)- ... 35*(rho.^4);

case 6, p = 45*(rho.^10)- 72*(rho.^8)+ 28*(rho.^6); case 8, p = 10*(rho.^10)- 9*(rho.^8);

case 10, p = (rho.^10); end; elseif n == 11 switch (l) case 1, p = 462*(rho.^11)-1260*(rho.^9)+ ... 1260*(rho.^7)- ... 560*(rho.^5)+105*(rho.^3)-6*rho; case 3, p = 330*(rho.^11)- 840*(rho.^9)+ ... 756*(rho.^7)- ...

280*(rho.^5)+ 35*(rho.^3);

case 5, p = 165*(rho.^11)- 360*(rho.^9)+ ... 252*(rho.^7)- 56*(rho.^5);

case 7, p = 55*(rho.^11)- 90*(rho.^9)+ 36*(rho.^7); case 9, p = 11*(rho.^11)- 10*(rho.^9);

case 11, p = (rho.^11); end; elseif n == 12 switch (l) case 0, p = 924*(rho.^12)-2772*(rho.^10)+ ... 3150*(rho.^8)- ... 1680*(rho.^6)+420*(rho.^4)-42*(rho.^2)+1; case 2, p = 792*(rho.^12)-2310*(rho.^10)+ ... 2520*(rho.^8)- ... 1260*(rho.^6)+280*(rho.^4)-21*(rho.^2); case 4, p = 495*(rho.^12)-1320*(rho.^10)+ ... 1260*(rho.^8)- ... 504*(rho.^6)+ 70*(rho.^4);

case 6, p = 220*(rho.^12)- 495*(rho.^10)+ ... 360*(rho.^8)- ...

84*(rho.^6);

case 8, p = 66*(rho.^12)- 110*(rho.^10)+45*(rho.^8); case 10, p = 12*(rho.^12)- 11*(rho.^10);

case 12, p = (rho.^12); end;

end;

function [min_x, max_x, min_y, max_y] = kotak_pembatas(F) % Mencari koordinat kotak yang membatasi

% citra F [m0, n0] = size(F); min_y = m0; max_y = 1; min_x = n0; max_x = 1; for i=1 : m0 for j=1: n0 if F(i,j) == 1 if min_y > i min_y = i; end

(58)

if max_y < i max_y = i; end if min_x > j min_x = j; end if max_x < j max_x = j; end end end end Akhir Program

Contoh penggunaan fungsi zermoment:

>> Img = im2bw(imread('C:\Image\ikan-4.png'), 0.5);  >> X = zermoment(Img,4,true)  X = 0.087641 0.585965 0.013469 0.042353 0.050947 0.191575 0.403293 >>

Pada contoh di atas, argumen kedua yang berupa nilai 4 menentukan orde polinomial dan argumen ketiga untuk menentukan fungsi akan menghasilkan gambar. Argumen ketiga dapat ditiadakan. Contoh gambar yang dihasilkan oleh zermoment ditunjukkan pada Gambar 12.20.

Gambar

Gambar  12.1 Objek yang sama melalui  efek penyekalaan (b),    translasi  (c), dan  pemutaran  (d)
Gambar  12.2 Tanda-tangan  kontur  diperoleh  dengan mula-mula  menghitung  jarak  antara  pusat massa dan  beberapa  titik pada  kontur
Gambar  12.3 Contoh  tanda-tangan  empat  citra  ikan
Gambar  12.4 Gambar  kontur  melalui  deskriptor  Fourier
+7

Referensi

Dokumen terkait

Kode telapak tangan (palm code) adalah kode unik yang diperoleh melalui ekstraksi fitur telapak tangan seseorang yang dapat digunakan sebagai identitas pembeda dengan

Pada paper ini, setelah proses ekstraksi fitur dilakukan, dan didapatkan beberapa parameter tiap ekstraksi fitur (warna, tekstur, bentuk) selanjutnya melakukan

telapak tangan, digunakan sensor berupa RGB camera dan depth camera. Sedangakan fitur yang digunakan untuk mengenali adalah fitur momen invarian untuk

Pengujian mengunakan metode euclidean distance untuk mencocokan nilai fitur citra queri dengan nilai fitur di database.Berdasarkan hasil pengujian dengan

Mekanisme pembobotan dilakukan untuk membuat keseimbangan [5] nilai fitur warna dan fitur bentuk yang digunakan dalam proses pencarian impresi, sesuai yang dibahas

Kode telapak tangan (palm code) adalah kode unik yang diperoleh melalui ekstraksi fitur telapak tangan seseorang yang dapat digunakan sebagai identitas pembeda dengan orang

Kode telapak tangan (palm code) adalah kode unik yang diperoleh melalui ekstraksi fitur telapak tangan seseorang yang dapat digunakan sebagai identitas pembeda dengan

Hasil yang didapatkan pada proses klasifikasi kupu-kupu mempunyai nilai akurasi sebesar 75% penggabungan dari ketiga ekstraksi fitur warna, fitur tekstur dan fitur