Operator Kirsch adalah salah satu algoritma yang digunakan dalam mendeteksi tepi pada saat proses pengolahan citra. Contoh yang dibahas kali ini adalah mendeteksi tepi dari sebuah citra.
Algoritma ini akan melakukan perhitungan perkiraan gradien dari intensitas sebuah citra. Operator ini menggunakan sebuah kernel yang dirotasi sebanyak 45 derajat sebanyak 8 kali sesuai arah mata angin / kompas, yaitu dengan urutan utara, barat laut, barat, barat daya, selatan, tenggara, timur, dan timur laut. Nilai magnitude kemudian dihitung dengan mencari nilai maksimum dari nilai kirsch yang telah ditemukan sebelumnya.
Diketahui data awal adalah sebagai berikut. Dalam kasus ini akan digunakan gambar berwarna bertipe jpg dengan ukuran 128 x 128 pixel
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan penyimpanan semua data warna dalam pixel yang terdapat dalam gambar tersebut
warna dalam sebuah pixel dibedakan menjadi 3 bagian, yaitu komponen merah, hijau, dan biru
For i = 0 To gmb.Width - 1 For j = 0 To gmb.Height - 1 inputPixel(i)(j)(0) = gmb.GetPixel(i, j).R inputPixel(i)(j)(1) = gmb.GetPixel(i, j).G inputPixel(i)(j)(2) = gmb.GetPixel(i, j).B Next j Next i
2. Lakukan perhitungan pada masing-masing pixel gambar tersebut (poin 2a – 2b)
For y As Integer = 0 To gmb.Height - 1 For x As Integer = 0 To gmb.Width - 1 . . .
2a. Lakukan perhitungan pada masing-masing komponen warna merah, hijau, biru (poin 2a1 – 2a3)
For i As Integer = 0 To 2 . . .
2a1. Cari pixel komponen warna disekitar pixel gambar terpilih
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
daftarPixelSekitar.Clear() daftarPixelSekitar = CariPixelSekitar(x, y, gmb, i)
* Gunakan fungsi ini untuk mencari pixel disekitar pixel terpilih
Ada 8 pixel yang dipilih yaitu dengan format
[1 2 3]
[4 X 5]
[6 7 8]
Jika pixel berada di tepi gambar, maka nilai pixel diluar tepi tersebut adalah 0
Public Function CariPixelSekitar(ByVal posisiX As Integer, ByVal posisiY As Integer, ByVal bmpData As Bitmap, ByVal idx As Integer) As ArrayList Dim daftarPixelSekitar As New ArrayList Dim xAwal As Integer = posisiX - 1 Dim xAkhir As Integer = posisiX + 1 Dim yAwal As Integer = posisiY - 1 Dim yAkhir As Integer = posisiY + 1 For y As Integer = yAwal To yAkhir For x As Integer = xAwal To xAkhir If (x < 0) Or (y < 0) Or (x > bmpData.Width - 1) Or (y > bmpData.Height - 1) Then daftarPixelSekitar.Add(0) Else If idx = 0 Then daftarPixelSekitar.Add(bmpData.GetPixel(x, y).R) ElseIf idx = 1 Then daftarPixelSekitar.Add(bmpData.GetPixel(x, y).G) ElseIf idx = 2 Then daftarPixelSekitar.Add(bmpData.GetPixel(x, y).B) End If End If Next x Next y Return daftarPixelSekitar End Function
2a2. Lakukan perhitungan nilai kirsch pada pixel ini
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini
Dim kirsch() As Integer = hitungNilaiKirsch(daftarPixelSekitar)
* Gunakan fungsi ini untuk menghitung nilai kirsch
Perkiraan ini menggunakan 8 kernel yang berasal dari 1 kernel yang dirotasi sebanyak 8 kali berlawanan arah jarum jam
Public Function hitungNilaiKirsch(ByVal daftarPixelSekitar As ArrayList) As Integer() Dim kirsch(7)(,) As Integer kirsch(0) = {{5, 5, 5}, _ {-3, 0, -3}, _ {-3, -3, -3}} kirsch(1) = {{5, 5, -3}, _ {5, 0, -3}, _ {-3, -3, -3}} kirsch(2) = {{5, -3, -3}, _ {5, 0, -3}, _ {5, -3, -3}} kirsch(3) = {{-3, -3, -3}, _ {5, 0, -3}, _ {5, 5, -3}} kirsch(4) = {{-3, -3, -3}, _ {-3, 0, -3}, _ {5, 5, 5}} kirsch(5) = {{-3, -3, -3}, _ {-3, 0, 5}, _ {-3, 5, 5}} kirsch(6) = {{-3, -3, 5}, _ {-3, 0, 5}, _ {-3, -3, 5}} kirsch(7) = {{-3, 5, 5}, _ {-3, 0, 5}, _ {-3, -3, -3}} Dim nilaiKirsch(7) As Integer For k As Integer = 0 To 7 Dim idxPixel As Integer = 0 For y As Integer = 0 To 2 For x As Integer = 0 To 2 nilaiKirsch(k) += (kirsch(k)(x, y) * Convert.ToInt32(daftarPixelSekitar(idxPixel))) idxPixel = idxPixel + 1 Next x Next y Next Return nilaiKirsch End Function
2a3. Hitung nilai magnitude dengan cara mencari nilai maksimal dari nilai kirsch yang telah ditemukan sebelumnya
For j As Integer = 0 To kirsch.Length - 1 If kirsch(j) > magnitude(i) Then magnitude(i) = kirsch(j) Next If magnitude(i) > 255 Then magnitude(i) = 255
2b. Masukkan magnitude yang telah dihitung ke dalam matriks output
outputPixel(x)(y) = {CByte(magnitude(0)), CByte(magnitude(1)), CByte(magnitude(2))}
* Tampilkan pada layar
Dim bitMap As Bitmap = BuatBitmap(outputPixel, 2) picHasil.Image = bitMap.Clone bitMap.Dispose()
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh source code lengkap dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.