Thursday, 27 October 2016

Pengolahan Citra 9: Kontur

Pembahasan Pertemuan 9
Jika pada pertemuan 8 yang lalu kita telah mempelajari mengenai deteksi tepi, di mana deteksi tepi ini masih kita gunakan untuk membuat latihan pembuatan program mengenai kontur pada pertemuan 9 ini. Jadi, pada pertemuan 9 ini kita akan membahas mengenai kontur yang akan berguna dalam membuat kode rantai yang akan dibahas pada pertemuan selanjutnya.

Sebelum kita membahas mengenai pembuatan program kontur, ada baiknya kita mengetahui apa itu kontur.  Kontur adalah rangkaian pixel yang membentuk batas daerah (region boundary). Kontur dapat berupa kontur terbuka dan kontur tertutup. Jika di atas kita menemukan kata kode rantai, ada baiknya kita tau apa itu kode rantai walaupun pembahasan ini harusnya dibahas pada pertemuan selanjutnya, setidaknya kita tau apa itu kode rantai.

Kode rantai adalah notasi untuk edge list dalam membentuk kontur. Kode rantai menspesifikasi arah setiap pixel tepi dalam edge list. Kode rantai digunakan untuk menggambar kontur. Selain itu juga dapat digunakan untuk membandingkan 2 atau lebih citra apakah citra tersebut adalah sama atau tidak. Cara membandingkan citra sama atau tidak adalah dengan menghitung kode rantai. Kode rantai yang akan kita hitung ada 8 sisi yang harus kita perhatikan. Berikut adalah arah yang perlu kita perhatikan:



Untuk menghitung kode rantai kita gunakan model seperti di atas. Untuk arah dapat dilakukan perhitungan pencarian kode rantai searah jarum jam atau berlawanan jarum jam dengan syarat mutlak yaitu harus konsisten, jika dari awal berlawanan jarum jam, maka sampai akhir harus sesuai arah berlawanan jarum jam.

Berikut ini adalah contoh penggambaran bagaimana kita mendapatkan kode rantai dengan menggunakan model di atas yang arahnya berlawanan jarum jam jika diketahui suatu citra seperti ini:


Untuk memulai menghitung kita mulai dari titk pertama yang ditemui dari paling atas. Lalu lanjut ke sebelahnya. Tetapi untuk proses tersebut, pada saat bertemu sisi sudut, kemungkinan besar perhitungan kita akan terhentikan dan tidak bisa dilanjutkan. Untuk itu kita gunakan cara perhitungan rekursif, yaitu suatu fungsi yang memanggil dirinya sendiri. Dengan mengikuti model yang kita sepakati diatas, maka proses pengisian kode rantai adalah sebagai berikut:


Berdasarkan model yang kita terapkan, maka yang lebih dulu diisi adalah angka 6, arah berlawanan jarum jam yang ditunjukkan adanya citra adalah warna kuning. Jadi angka 6 tersebut yang terlebih dulu ditemui, maka posisi dengan angka 6 yang diisi terlebih dahulu. Selanjutnya:


Dari gambar di atas, yang selanjutnya diisi adalah posisi bintang. Karena begitu pusat model ada di posisi angka 6, dengan arah berlawanan jarum jam yang terlebih dahulu diisi adalah kotak dengan isi bintang dengan nilai posisi 2. Karena nilai 1 tidak termasuk citra yang ingin dicari kode rantainya. Proses selanjutnya akan sama perhitungannya dilihat yang mana yang terlebih dahulu dikunjungi, maka citra itu yang mendapatkan kode rantai selanjutnya.


Pada gambar di atas, kode rantai berikutnya adalah posisi yang diisi dengan angka 8, karena nilai 6 telah diisi. Selanjutnya:


Dari proses di atas, kita masih mendapatkan angka nilai 8. Untuk tahapan berikutnya, kita mulai menggunakan fungsi rekursif (stack). Jadi yang diisi adalah:




Dalam tahap ini ada baiknya untuk bisa menampungnya. Perhitungan di atas kita gunakan fungsi rekursif. Karena semua citra yang dekat dengan titik pusat telah diisi dengan angka. Proses akan terus berjalan, seperti berikut:



Dengan kasus seperti di atas, sekarang ini pusat sudah berpindah posisi lagi karena jika pada posisi sebelumnya telah seperti berikut:


Dari gambar di atas kita lihat bahwa titik pusat kembali ke titik sebelumnya. Selanjutnya:




Selanjutnya:




Yang diisi terlebih dahulu adalah posisi 4 karena sesuai dengan metode-metode. Selanjutnya:


Selanjutnya akan diisi dengan angka 1:




Kita sudah berhasil mengisi semua nilai pada citra, maka kode rantai yang kita dapat adalah:
6 – 2 – 8 – 8 – 6 – 1 – 1 – 6 – 5 – 5 – 4 – 6 – 1

Kode rantai ini lah yang akan digunakan untuk membandingkan 2 citra atau lebih. Jika kode rantai berbeda walaupun beda tata letak, maka tetap sama.

Pada pertemuan 9 ini kita hanya membuat kontur dari citra yang berbentuk bangun datar. Untuk itu, di bawah ini akan mulai dibahas mengenai Source Codenya:










Source Code untuk file html:


Proses Compile Percobaan Pertama:



Tampilan Untuk Percobaan 1:


Compile Untuk Percobaan 2:



Tampilan Untuk Percobaan 2:



Sekian pembahasan dari pertemuan 9 ini, pembahasan selanjutnya mengenai kode rantai akan dijelaskan pada pertemuan 10.







Pengolahan Citra 8: Deteksi Tepi

Pembahasan Pertemuan 8

Mind mapping sebelumnya:


Pada pertemuan 8 ini akan membahas mengenai deteksi tepi. Tepi merupakan suatu perubahan nilai intensitas derajat keabuan yang mendadak dalam jarak yang singkat. Tepi objek merupakan pertemuan antara bagian objek dan bagian latar belakang. Ada tiga jenis tepi yaitu:
  1. Tepi curam: perubahan intensitas tajam
  2. Tepi landai: perubahan intensitas perlahan-lahan
  3. Tepi yang mengandung noise: terdapat pada aplikasi computer vision

Pada metode deteksi tepi, ada tiga cara, yaitu:

1. 
 
Deteksi titik
    Menggunakan high pass filtering dengan koefisien 0
    Kernel yang digunakan adalah


    Maksud dari kernel di atas adalah objek terang yang berbatasan 
    dengan gelap.

2. Deteksi garis
    Membutuhkan 3 buah kernel, yaitu: kernel Horizontal, Vertikal, dan 
    Diagonal.

    Kernel Horizontal:

    Kernel Vertikal:

    Kernel Diagonal Kiri:

    Kernel Diagonal Kanan:

Operator
Ada dua jenis yaitu: Gradien Turunan 1, dan Kompas.

Pada pertemuan ini yang akan kita coba adalah deteksi tepi menggunakan operator gradient. Yaitu operator Robert, Sobel, dan Prewit.ketiganya ini merupakan bagian dari operator gradient. Berikut ini adalah kernel dari masing-masing operator:

Kernel Robert:

Robert-X:


Robert-Y:

Kernel Sobel:

Sobel-X:

Sobel-Y:

Kernel Prewit:

Prewit-X:

Prewit-Y:

Sekarang, langsung kita bahas mengenai pembuatan program untuk melakukan deteksi tepi pada citra. Berikut ini adalah source code dari program deteksi tepi (Tanpa Method).








Source Code DeteksiTepi.java (Dengan Method):







Dari source code di atas, untuk yang menggunakan method dan tidak menggunakan method akan menghasilkan hasil yang sama, hanya perbedaan pada bagaimana cara menyusun program tersebut. Jika menggunakan method, kita haya perlu memanggil fungsi konvolusi() saja pada saat menghitung hasil Robert, Sobel, dan Prewit. Pada pembahasan ini diberikan dua tipe source code agar kita lebih memahami bagaimana pembuatannya. Jika lebih mudah tanpa method, maka gunakan yang tanpa menggunakan method, jika lebih mudah dimengerti dengan menggunakan method, maka gunakan method seperti pada source code di atas.

Untuk mendapatkan hasil deteksi tepi pada masing-masing operator, dibandingkan dari nilai kernel operator X dan Y, setekah dibandingkan diambil nilai yang terbesar untuk dijadikan hasil.

Contoh untuk source code tanpa method:

Berikut ini adalah source code html:


Proses Compile DeteksiTepi.java (Tanpa Method):



Hasil Tampilan (Tanpa Method):


Proses compile DeteksiTepi.java (Dengan Method):



Hasil tampilan (Dengan Method):


Demikian pembahasan pertemuan 8 ini, pada dasarnya menggunakan method atau tidak akan sama saja hasilnya selama perhitungan pada proses konvolusi benar.