implementasi coding thinning dalam java

Upload: annasinformatika08

Post on 11-Jul-2015

265 views

Category:

Documents


6 download

TRANSCRIPT

Tugas Mata Kuliah Pengolahan Citra

Thinning

Disusun oleh Kelompok 4: Haryani Diah Sitawati (1201000474) Rinawati (1201000911) Sari Widya Sihwi (120100097Y) Sita Annisa R (1201001004)

FAKULTAS ILMU KOMPUTER UNIVERSITAS INDONESIA Depok, November 2003

DAFTAR ISIDAFTAR ISI ............................................................................................................ i BAB I PENDAHULUAN ..................................................................................... 1

BAB II ALGORITMA DAN PENJELASAN....................................................... 3 BAB III CONTOH HASIL...................................................................................... 10 LAMPIRAN : IMPLEMENTASI CODING THINNING DALAM JAVA............ 13

BAB I PENDAHULUAN

Thinning adalah operasi morfologis yang digunakan untuk menghilangkan piksel foreground yang dipilih dari gambar biner1. Metode ini digunakan untuk mendeteksi kerangka dari suatu gambar (image). Thinning biasanya diterapkan pada gambar biner dan menghasilkan gambar biner lain sebagai output. Thinning biasanya digunakan untuk proses skeletonization, yaitu transformasi gambar di mana pada hasil akhir akan didapat kerangka (skeleton) dari gambar sumber. Skeletonization akan mengurangi wilayah foreground dari gambar biner (binary image) menjadi bentuk kerangka yang secara garis besar akan menampilkan perluasan dan konektivitas dari wilayah asli sambil membuang hampir keseluruhan dari piksel foreground asli. Sebagai contoh dapat dilihat gambar di bawah ini:

merupakan hasil skeletonizing dari

merupakan hasil skeletonizing dari Dalam skeletonization dilakukan pengurangan terhadap semua garis sehingga diperoleh ketebalan sebanyak hanya satu piksel.

1

Gambar di mana pikselnya hanya memilki dua kemungkinan nilai intensitas, 0 atau 255. Nilai 0 merepresentasikan warna hitam dan 255 merepresentasikan warna putih. (sumber: http://www.cee.hw.ac.uk /hipr/html/binimage.html)

Adapun thinning yang dilakukan secara berulang-ulang akan menghasilkan gambar seperti tersebut di atas. Lebih lanjut, penggunaan thinning dapat dilihat pada beberapa aplikasi nyata seperti pengenalan karakter optis, pengenalan sidik jari, pemrosesan dokumen, pengenalan struktur sel biologis dan sebagainya. Aplikasi dari thinning biasanya menyangkut obyek di mana ketebalan bentuk tidak berpengaruh terhadap proses pengenalan. Obyek tersebut cukup dapat dideskripsikan dengan struktur yang disusun dari garis-garis yang terhubung.

BAB II ALGORITMA DAN PENJELASANNYAPada kenyataannya, banyak sekali algoritma thinning yang telah dikembangkan sampai saat ini. Masing-masing algoritma tersebut memiliki keunggulan dan kekurangan tersendiri, dan penerapannya pun tergantung pada aplikasi apa yang ingin dibangun. Sejauh ini kami menemukan dua algoritma yang kami pikir menarik untuk disampaikan. Berikut merupakan penjelasan dari keduanya. 2.1 Algoritma Thinning A Di bawah ini, merupakan algoritma untuk Thinning yang kami peroleh dari website: http://www.fmrib.ox.ac.uk/~steve/susan/thinning/node2.html#SECTION0002000000000 0000000

Algoritma ini akan menghilangkan titik sisi (edge point) palsu atau yang tidak diinginkan dan menambahkan titik sisi di suatu tempat yang seharusnya ada tetapi kenyataannya belum ada. Aturan ini diperluas menjadi : 1. Menghilangkan titik sisi palsu atau yang tidak diinginkan 2. Menambahkan titik sisi baru 3. Menggeser titik sisi ke posisi baru. Aturan ini diberlakukan dengan menerapkan prinsip piksel 8-tetangga (lihat gambar di atas). Apabila node dari edge memiliki: 0 tetangga Buang edge point tersebut. 1 tetangga Cari tetangga dengan respon sisi (edge-response) yang maksimum (tetangga bukan nol) untuk melanjutkan di sisinya dan untuk mengisi gap pada sisi (edge). Edge akan cenderung untuk melanjutkan membentuk garis lurus. Sebuah sisi dapat diperluas oleh maksimum 3 piksel. 2 tetangga Ada tiga kemungkinan: 1. Jika titik tersebut menyembul keluar dari suatu garis lurus, maka bandingkan respon sisi tersebut terhadap titik-titik yang berkorespondensi dalam garis. Jika titik yang berpotensial berada pada sisi lurus memiliki nilai respon sisi lebih besar 0,7 dari nilai respon sisi sekarang, pindahkan titik itu ke dalam tempat kosong dalam garis (sehingga membentuk suatu garis lurus). 2. Jika sisi menyatu dengan piksel diagonal, maka buang sisi tersebut. 3. Selain itu, berarti sisi tersebut valid Lebih dari 2 tetangga Jika bukan penghubung antara multiple edge maka sisi tersebut wajib dibuang. Hal ini melibatkan pilihan antara posisi asal dan tetangganya

Hal ini berlaku untuk semua piksel pada gambar (image) secara berurutan dari kiri ke kanan dan dari atas ke bawah. Jika ada perubahan pada sisi gambar maka pointer akan dipindahkan dua piksel ke atas dan dua piksel ke kiri. 2.2 Algoritma Thinning B Algoritma berikut didasarkan pada buku Image Processing in JAVA karangan Douglas A. Lyon dan lebih lengkapnya diperoleh dari website: http://www.cee.hw.ac.uk/hipr/html/thin.html Pengarang buku dan pembuat website ini meninjau salah satu fungsi utama dari thinning, yaitu untuk mengurangi output dari pendeteksi sisi (edge detector), seperti operator Sobel, yang mengalami threshold (thresholded output). Hal ini ditujukan untuk mengurangi ketebalan tiap satu piksel sehingga membentuk semacam garis sambil memperhitungkan keseluruhan panjang dari kesatuan garis-garis tersebut. Adapun algoritma yang dihasilkan dengan memandang thinning dari sisi kegunaan di atas akan melibatkan pembagian wilayah foreground dan background, serta pengoperasian kernel (structuring element) di mana elemen kernelnya harus dipastikan memilki nilai 1 atau kosong (agar membawa efek). Gambar akan diletakkan di bawah kernel untuk dibandingkan. Apabila piksel foreground dan background pada kernel persis sama dengan gambar, maka piksel gambar yang terletak di bawah kernel asli akan diset ke background (zero). Selain itu tidak akan terjadi perubahan pada gambar. Lebih jauh, situasi yang menyebabkan foreground piksel ke background akan menjadi titik penting untuk menentukan pilihan kernel. Proses thinning dengan algoritma ini juga menerapkan operasi hit and miss dan pruning. Berikut penjelasan singkat dari kedua operasi tersebut. Hit and miss

Transformasi hit and miss adalah operasi morfologis biner yang dapat digunakan untuk melihat pola tertentu dari piksel foreground dan background dalam sebuah gambar. Hit and miss sebenarnya merupakan operasi dasar dalam morfologis biner karena operator morfologis biner yang lain dapat diturunkan dari hit and miss. Transformasi hit and miss digunakan untuk melihat kemunculan pola biner tertentu dalam orientasi tetap. Ini dapat digunakan untuk melihat beberapa poIa (atau pola yang sama dalam orientasi berbeda) dengan menjalankan transformasi secara suksesif menggunakan elemen struktur yang berbeda.

Figure 1 Penjelasan gambar (kernel): 1. 2. 3a & 3b untuk mengisolasi titik dalam gambar biner untuk mencari lokasi titik akhir dari skeleton biner (dibutuhkan 4 hit and miss) untuk mencari lokasi titik triple (junction) dari skeleton (dibutuhkan 8 hit and miss) Dalam thinning, kernel yang digunakan adalah sebagaimana telah dideskripsikan pada transformasi hit and miss. Adapun hubungan antara keduanya dapat dituliskan dengan rumus:

di mana I adalah image yang hendak di-thinning , J adalah kernel, serta pengurangan merupakan operasi logika yang didefinisikan sebagai: .

Pruning Bisa dianggap salah satu aplikasi thinning. Ditujukan untuk menghilangkan spur akibat ketidakteraturan pada daerah batas dari gambar asli. Pruning diterapkan pada sejumlah terbatas iterasi (tidak sampai konvergen) untuk menghindari terbuangnya semua piksel. Contoh kernel untuk pruning adalah

Figure 2 Penjelasan gambar (kernel): 1. 2. untuk menemukan batas (4-tetangga) pada obyek biner, misal: menghapus titik foreground yang tidak memiliki tetangga pada backgroundnya. untuk penerapan dengan batas 8-tetangga. 3a&3b. untuk pruning (tiap iterasi harus melibatkan 4 rotasi 90 dari elemen). Dari seluruh uraian di atas, diperoleh sebuah algoritma yang secara sederhana dapat dituliskan sebagai berikut: 1. Pertimbangkan semua piksel batas dari wilayah foreground (misalnya, titik foreground yang memiliki minimal satu tetangga background (background neighbour)). 2. Hapus setiap titik yang memiliki lebih dari satu tetangga foreground (foreground neighbour) sepanjang dengan melakukan hal tersebut tidak mengakibatkan terpisahnya dua wilayah yang mengandung piksel tersebut secara lokal. 3. Ulangi hingga garis konvergen. Prosedur ini mengikis sebanyak mungkin batas (boundaries) dari obyek foreground tetapi tidak mempengaruhi piksel pada ujung garis. Contoh dari penerapan prosedur ini:

Figure 3 Gambar sebelum dan sesudah thinning Efek ini bisa diperoleh menggunakan morfologi thinning dengan mengiterasi hingga konvergen dengan kernel 3x3 pada Figure 2 (lihat di bawah) dan semua transformasi rotasi 90dari kernel ini (total 42 = 8 kernels).

Figure 4 Pada setiap iterasi, image akan dioperasikan dengan kernel di sebelah kiri, lalu dilanjutkan operasi dengan kernel di sebelah kanan, dan selanjutnya dengan 6 hasil rotasi 90 dari kedua elemen itu. Proses akan berulang secara siklis sampai tidak ditemui perubahan lagi. Dapat dikatakan bahwa di sini kita melakukan penentuan octagonal skeleton dari bentuk biner, yaitu himpunan titik yang tersebar di tengah oktagon yang menempati bagian dalam dari bentuk atau menyentuh batas bentuk minimal 2 titik. 2.3 Perbandingan Setelah meninjau penjelasan kedua algoritma di atas, dapat kita lihat perbedaan dari keduanya, di mana kompleksitas algoritma B jauh lebih tinggi dibandingkan algoritma A.

Algoritma A tidak melibatkan istilah-istilah seperti wilayah foreground, background, maupun kernel. Dalam operasi penentuan batas (boundary)-nya, algoritma A hanya menggunakan prinsip 8-tetangga. Karena itu pengimplementasian dari algoritma ini menjadi jauh lebih simple. Algoritma B menghubungkan thinning dengan prinsip-prinsip operasi morfologi dan mengkaitkannya dengan fungsi edge detector, seperti operator Sobel dan Canny. Karenanya untuk menerapkan algoritma ini dibutuhkan pengertian-pengertian mengenai operasi thresholding2, skeletonizing, transformasi hit and miss, dan pruning dan lain sebagainya. Namun demikian, pada nyatanya algoritma ini memang lebih useful dibandingkan algoritma sebelumnya. Hal ini disebabkan algoritma B dapat diterapkan dalam berbagai aplikasi yang bersifat umum (seperti yang telah dijelaskan di atas) dan pengembangannya pun lebih luas (dapat dilihat dari jumlah orang-orang yang menggunakannya di Internet).

2

Thresholding ditujukan untuk memisahkan wilayah terkorespondensi pada gambar yang kita inginkan dengan wilayah backgroundnya dengan menggunakan segmentasi berbasis intensitas/warna pada kedua wilayah tersebut. Dalam penerapannya, segmentasi tersebut seringkali tidak sempurna sehingga harus diproses lebih jauh (misalnya, dengan menggunakan thinning).

BAB III CONTOH HASIL

Untuk memberikan gambaran lebih detail, berikut dapat dilihat hasil operasi thinning pada beberapa gambar (termasuk untuk character recognition) :

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

Sebelum Thinning

Sesudah Thinning

LAMPIRAN IMPLEMENTASI CODING THINNING DALAM JAVA

Berikut kami lampirkan contoh coding algoritma http://www.dai.ed.ac.uk/HIPR2/thindemo.htm//begin here import java.applet.*; import java.awt.*; import java.awt.image.*; import java.net.*; import java.util.*; import java.io.*; import java.lang.Math; /**

B

dari

website

:

* Thin is an algorithm to thin a binary image using a 3x3 kernel. * @author Simon Horne. */ public class Thin extends Thread { /** * The default constructor with no parameters. */ public Thin() { } /** * Takes an image and a kernel and thins it once. * * @param b the BinaryFast input image * @param kernel the thinning kernel * @return the thinned BinaryFast image */ public static BinaryFast ThinBinaryRep(BinaryFast b, int [] kernel){ Point p; HashSet result = new HashSet(); HashSet inputHashSet = new HashSet();

if(HitMiss.kernelNo0s(kernel)){ for(int j=0;j