Search what you want

Tuesday, January 5, 2016

[PPCD] Segmentasi

nah pada kesempatan ini kita kan coba bahas tentang segmentasi. nah terus apa sih gunanya dilakukannya segmentasi? sebagai contoh jika kita akan menghitung jumlah mobil dijalannan secara realtime (car counting) kita harus mengetahui bahwa ada objek mobil disana, kita harus dapat memisahkkan mobil dari jalannya agar bisa dilakukan counting. nah dari masalah itu memisahkan objek dari latarnya merupakan masalah segmentasi, tp sekarang bagaimana melakukan segmentasi terhadap gambar???

ayo kita bahas.
terdapat dua tahap yang harus dilakukan untuk melakukan segmentasi:
1. Discountinuity -> deteksi tepi (edge detection)
2. Similarity -> mencari intensitas yang seragam


1. Similarity
pertama saya coba bahas bagaimana cara melakukan similarity / mencari pixel-pixel saling similar. nah cara mencari pixel yang similar, kita dapat melakukan point detection, caranya? lakukan dengan meng-konvolusikan filter tertentu dengan image yang akan kita olah

sebagai contoh kita memiliki kernel filter
| -1 -1  -1 |
| -1  8   -1|
| -1 -1  -1 |

sekarang kita akan mencari pixel yang seragam/similar dengan pixel-pixel di sekelilingnya. bgaimana caranya? sekarang kita memiliki (contoh) image yang similar antara
| 10 10 10 |
| 10 10 10 |   <------ image (pixel) yang similar
| 10 10 10 |

misal kita akan mencari point/pixel yang berada di tengah (apakah dia similar dengan nilai disekelilingnya?)
kita lakukan konvolusi antara image kernel filternya. maka:

| -1 -1  -1 |      | 10 10 10 |          | 10 10 10 |
| -1  8   -1|   x | 10 10 10 |    =    | 10   0 10 |
| -1 -1  -1 |      | 10 10 10 |          | 10 10 10 |

artinya jika pixel-pixel tersebut memiliki nilai yang sama(similar) maka nilai hhasil konvolusinya akan seragam semua.


berbeda jika nilai pixelnya tidak seragam, (misal) ->
| 10 10 10 |
| 10   0 10 |   <------ image (pixel) yang tidak similar
| 10 10 10 |

kita lakukan konvolusi antara image kernel filternya. maka:

| -1 -1  -1 |      | 10 10 10 |          | 10 10   10 |
| -1  8   -1|   x | 10 10 10 |    =    | 10  -80 10 |
| -1 -1  -1 |      | 10 10 10 |          | 10 10   10 |

artinya, jika pixelnya berbeda-beda maka nilai akhirnya juga akan berbeda-beda (tidak seragam)

apakah udah selesai? beloman. tahap terakhir kita lakukan tresholding hasil dari convolusi image dengan kernelnya itu.

f(x) = | 1 , f(x,y) >= treshold
          | 0 , f(x,y) <   treshold

2. Discountinuity (edge detection)
sebenarnya tahap ini merupakan tahap awal proses segmentasi, sebelum dilakukannya similarity. tetappi jadi kita bahas jadi bahasan kedua, ya gpp kan ya? kayanya sih bahasin ini akan sedikit banyak. langsung saja kita ke materinya.

sebelum kita melakukan edge detection ada baiknya kita laklukna smooting (langkah ini tergantung dari gambar asli yang digunakan). smoothing ini dilakukan karena pada proses deteksi tepi hanya memerlukan memilih objeknya saja, tidak perlu detail dari objeknya.

salah satu edge detection itu adalah line detection. misalkan terdapat 4 kernel, satu kernel mendeteksi line berdasarkan garis horizontal, kernel yang lain digunakan untuk mendeteksi secara vertikal, garis 45 derajat dan garis -45 derajat. bagaimana sih kernelnya?

| -1 -1 -1 |
|  2   2  2 |   <------ iHorizontal
| -1 -1 -1 |

| -1  2  -1 |
| -1  2  -1 |   <------ Verikal
| -1  2  -1 |

|   2 -1 -1 |
| -1   2 -1 |   <------ 45 derajat
| -1 -1   2 |

| -1 -1   2 |
| -1   2 -1 |   <------ -45 derajat
|   2 -1 -1 |

dibawah ini meruakan perbedaan menggunakan masing-masing kernel untuk line detection (45, -45, vertikal, horizontal)




 ------------------------------------
selanjutnya akan kita bahas teknik lain untuk melakukan deteksi tepi, yaitu menggunakan "gradient". langsung saja saya coba jelaskan bagaimanakah step-stepnya:
1. lakukan smoothing pada gambar -> kalikan citra dengan kernel untuk smoothing

2. cari gradient x                              -> kalikan citra dengan kernel x

3. cari gradient y                              -> kalikan citra dengan kernel y

4. cari magnitude(x,y)                      -> tambahkan hasil dari gradient x dan y

5. cari dir(x,y)                                  

6. tentukan treshold(T), jika mag(x,y)>T maka possible edge point


nah sekarang, apa aja sih kernel yang bisa digunakan dalam edge detection menggunakan gradient. beberapa kernel yang terkenal untuk mendeteksi edge ada 3, yaitu Robert, Prewitt, Sobel:

Robert:
|  1  0  |
|  0  -1 |   <------ Mx

|  0  1  |
| -1  0 |   <------ My

Prewitt
| -1 0 1 |
| -1 0 1 |   <------ Mx
| -1 0 1 |

| -1 -1 -1 |
|  0  0   0 |   <------ My
|  1  1   1 |

Sobel
| -1 0 1 |
| -2 0 2 |   <------ Mx
| -1 0 1 |

| -1 -2 -1 |
|  0  0   0 |   <------ My
|  1  2   1 |

sebagai contoh, saya akan menjabarkan perhitungan menggunakan kernel prewitt:
misalkan ada citra sebagai berikut->
| 38 66 65 |
| 14 35 64 |
| 12 15 42 |

fx = (12 + 15 + 42) - (38 + 66 + 65)
    = 69 - 169
    = -100
fy = (65 + 64 + 42) - (38 + 14 + 12)
    = 171 -64
    = 107
|df| = |-100| + |107| = 207

jika T = 190 maka f(1.1) merupakan edge


No comments:

Post a Comment