Deteksi Tepi dengan Operator Roberts cross


Operator Roberts cross 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 kernel berukuran 2 x 2 yang akan digabungkan dengan gambar sebenarnya untuk menghitung nilai perkiraan jawaban, yang didapatkan dari menghitung jumlah kuadrat selisih antara pixel yang saling bersilangan. Proses ini akan dilakukan sebanyak 2 kali, yaitu secara horizontal dan vertikal. Kemudian nilai magnitude gradient dihitung menggunakan rumus phytagoras.



Diketahui data awal adalah sebagai berikut. Dalam kasus ini akan digunakan gambar berwarna bertipe jpg dengan ukuran 128 x 128 pixel
lena


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 3 pixel yang dipilih yaitu dengan format
[X 1]
[2 3]

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
	Dim xAkhir As Integer = posisiX + 1
	Dim yAwal As Integer = posisiY
	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 roberts cross secara horizontal (sumbu X) dan vertikal (sumbu Y)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

Dim robertscrossX As Integer = hitungNilaiRobertsCross(daftarPixelSekitar, "X")
Dim robertscrossY As Integer = hitungNilaiRobertsCross(daftarPixelSekitar, "Y")

* Gunakan fungsi ini untuk menghitung nilai Roberts Cross
Perkiraan ini akan dilakukan 2 kali, yaitu secara horizontal (sumbu X) dan vertikal (sumbu Y)

Public Function hitungNilaiRobertsCross(ByVal daftarPixelSekitar As ArrayList, ByVal tipeKernel As String) As Integer
	Dim nilaiRobertsCross As Integer = 0

	Dim robertscrossX As Integer(,) = {{1, 0}, {0, -1}}
	Dim robertscrossY As Integer(,) = {{0, 1}, {-1, 0}}

	Dim idxPixel As Integer = 0

	If (tipeKernel = "X") Then
		For y As Integer = 0 To 1
			For x As Integer = 0 To 1
				nilaiRobertsCross = nilaiRobertsCross + (robertscrossX(x, y) * Convert.ToInt32(daftarPixelSekitar(idxPixel)))
				idxPixel = idxPixel + 1
			Next x
		Next y
	ElseIf (tipeKernel = "Y") Then
		For y As Integer = 0 To 1
			For x As Integer = 0 To 1
				nilaiRobertsCross = nilaiRobertsCross + (robertscrossY(x, y) * Convert.ToInt32(daftarPixelSekitar(idxPixel)))
				idxPixel = idxPixel + 1
			Next x
		Next y
	End If

	Return nilaiRobertsCross
End Function

2a3. Hitung nilai magnitude dengan rumus:
magnitude = V(Gx^2 + Gy^2)

magnitude(i) = Math.Sqrt(Math.Pow(prewittX, 2) + Math.Pow(prewittY, 2))
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)

cmd125


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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *