Tahap ini akan dibagi ke dalam empat procedure, yaitu procedure Graylvl, procedure Filtr, procedure Threshold, procedure Skelt, dan procedure Dir_Hist.
Setiap gambar yang diterima oleh sistem akan diproses melalui lima tahap ini.
4.6.1 Procedure Graylvl
Pada procedure ini, gambar yang diterima akan dirubah menjadi tipe gambar grayscale, untuk dapat maju ke tahap selanjutnya. Pada proses ini dilakukan penggabungan ketiga unsur warna dengan cara menjumlahkan ketiga unsur tersebut dan membagi hasil penjumlahan dengan jumlah unsur warna dasar.
Segment Program 4.7. Procedure Graylvl
Hasil dari procedure Graylvl ini, akan tersimpan pada variabel array gray, dimana tipe dari array ini adalah byte, dan hanya memiliki satu nilai, yaitu tingkat graylevel yang berada di antara 0 sampai 255.
4.6.2. Procedure Filtr
Procedure Filtr adalah procedure yang berfungsi sebagai filter. Pada bagian ini, gambar yang sudah melalui proses pada procedure Graylvl, akan dikenakan filter. Sehingga gambar menjadi lebih tajam dibandingkan dengan gambar yang di-input-kan pada saat pertama kali. Operasi penajaman gambar ini dilakukan dengan menggunakan metode laplacian. Untuk lebih jelasnya, dapat dilihat pada segment program berikut ini.
Segment Program 4.8 Implementasi Metode Laplacian
4.6.3. Procedure Threshold
Pada bagian ini, gambar akan dirubah menjadi tipe gambar bi-level dengan menggunakan proses threshold. Pada proses threshold, langkah pertama yang dilakukan ialah mendata semua jumlah pixel yang ada, dimulai dari 0 sampai dengan 255. Pada segment program 4.9, dapat dilihat bahwa gambar sudah terpetakan ke dalam sebuah array tt.
Dari hasil pemetaan pada array tt ini, akan dilakukan perhitungan jumlah dari suatu nilai pixel. Hasil perhitungan tersebut akan dimasukkan ke dalam array ota.
Segment Program 4.9. Sensus Pixel
'color census
n = 0
C = 0
For j = 0 To UBound(tt, 2)
For i = 0 To UBound(tt, 1)
m = tt(i, j)
ota(m) = ota(m) + 1
Next
Next
Langkah selanjutnya ialah dengan menghitung rata-rata kedua sisi dari histogram, dengan menggunakan tingkat threshold sementara, yang dilakukan dengan menggunakan iterasi.
Segment Program 4.10. Perhitungan Nilai Rata-Rata per Sisi Histogram
'recursively count
c1 = 0
c2 = 0
n1 = 0
n2 = 0
'less than t0 mean count
For i = 0 To (t0 - 1)
If i = 0 Then
If ota(i) <> 0 Then
n1 = ota(i)
c1 = ota(i)
End If
Else
If ota(i) <> 0 Then
n1 = n1 + (ota(i) * i)
c1 = c1 + ota(i)
End If
End If
Next
t1 = Round(n1 / c1)
'great than t0 mean count
For i = t0 To 255
If ota(i) <> 0 Then
n2 = n2 + (ota(i) * i)
c2 = c2 + ota(i)
End If
Next
t2 = Round(n2 / c2)
Setelah dilakukan perhitungan terhadap kedua sisi dari histogram, langkah selanjutnya adalah dengan membandingkan hasil perhitungan untuk dapat menghasikan nilai threshold yang optimum.
Segment Program 4.11 Perbandingan Kedua Sisi Histogram
'comparing both side of gray histogram
If t0 <> Round((t1 + t2) / 2) Then
thb = False
t0 = Round((t1 + t2) / 2)
Else
thb = True
End If
Baik segment program 4.10 maupun 4.11, akan dilakukan secara berulangulang sehingga didapatkan nilai threshold teroptimum. Setelah mendapatkan nilai yang paling optimum, tahap selanjutnya adalah mengganti semua nilai pixel yang ada menjadi 255 atau 0, dengan menggunakan batasan nilai threshold.
Segment Program 4.12. Setting Nilai Pixel Yang Baru
'for each pixel do
For j = 0 To UBound(tt, 2)
For i = 0 To UBound(tt, 1)
'put the value on array and picture
If tt(i, j) < t0 Then
t = 0
Else
t = 255
End If
ot(i, j) = t
Next
Next
Hasil dari procedure ini menghasilkan gambar bi-level yang tersimpan pada variabel array ot. Nilai yang terdapat pada variabel ini hanya 0 dan 255.
4.6.4. Procedure Skelt
Procedure Skelt adalah proses thinning. Pada procedure ini, gambar akan direduksi sedemikian rupa hingga memudahkan sistem untuk melakukan operasi lainnya. Dalam proses thinning ini, terdapat beberapa aturan yang harus diterapkan, yaitu :
• Jumlah neighbour dari pixel target harus memiliki minimal 2 atau maksimal 6.
Maksud dari aturan ini adalah, di sekeliling pixel target, harus terdapat minimal 2 atau maksimal 6 pixel yang bukan berwarna background. Hal ini dilakukan agar pixel yang berada di tepi obyek tidak terhapus.
• Sebuah pixel, hanya bisa dihapus apabila hanya memiliki 1 counting index.
Aturan ini menyatakan bahwa, sebuah pixel yang akan dihapus haruslah merupakan bagian dari 1 region saja. Apabila sebuah pixel merupakan titik temu antar 2 region dihapus, maka akan terjadi pemutusan region, sehingga dari proses ini akan menghasilkan 2 buah region yang terpisah.
• Untuk pengecekan pertama, sebuah pixel dapat dihapus apabila tetangga kiri,
tetangga bawah, atau tetangga kanan berwarna putih (background), dan sebuah pixel dapat dihapus apabila tetangga bawah, tetangga kanan, atau tetangga atas berwarna putih (background).
• Untuk pengecekan kedua, sebuha pixel dapat dihapus apabila tetangga kiri,
tetangga bawah, atau tetangga atas berwarna putih (background), dan sebuah pixel dapat dihapus apabila tetangga kiri, tetangga kanan, atau tetangga atas berwarna putih (background).
Untuk aturan yang pertama dan kedua, dibuatkan 2 buah function, yaitu function Nay8 dan function Crossing_Index. Function Nay8 berfungsi untuk mendata pixel yang berada di sekeliling pixel target. Dari function ini akandihasilkan jumlah pixel yang bukan berwarna putih atau background. Untuk lebih jelasnya, dapat dilihat pada segment program 4.13.
Segment Program 4.13. Function Nay8
Function Crossing_Index adalah sebuah function yang digunakan untuk mengetahui apakah suatu pixel merupakan titik temu antara satu region dengan region yang lain. Function ini bekerja dengan cara mengecek sekeliling pixel target, apabila nilai pixel yang sedang di analisa berbeda dengan nilai pixel asal, maka counter akan di-increment-kan. Di akhir looping, nilai counter akan dibagi dengan dua dan menjadi hasil dari function ini. Untuk lebih jelasnya dapat dilihat pada segment program berikut ini.
Segment Program 4.14. Function Crossing_Index
Function crossing_index(tmp() As Byte, value As Byte) As Long
Dim count As Long
count = 0
k = tmp(0, 0)
If k <> tmp(0, 1) Then
k = tmp(0, 1)
count = count + 1
End If
If k <> tmp(0, 2) Then
k = tmp(0, 2)
count = count + 1
End If
If k <> tmp(1, 2) Then
k = tmp(1, 2)
count = count + 1
End If
If k <> tmp(2, 2) Then
k = tmp(2, 2)
count = count + 1
End If
If k <> tmp(2, 1) Then
k = tmp(2, 1)
count = count + 1
End If
If k <> tmp(2, 0) Then
k = tmp(2, 0)
count = count + 1
End If
If k <> tmp(1, 0) Then
k = tmp(1, 0)
count = count + 1
End If
If k <> tmp(0, 0) Then
k = tmp(0, 0)
count = count + 1
End If
crossing_index = count / 2
End Function
Untuk implementasi ke-empat aturan yang ada, dapat dilihat pada segment program 4.15.
Segment Program 4.15. Implementasi Aturan Thinning
Do
again = 0
For j = 0 To UBound(tht, 2)
For i = 0 To UBound(tht, 1)
If thr(i, j) <> 255 Then
row = i
Col = j
For ii = (row - 1) To (row + 1)
For jj = (Col - 1) To (Col + 1)
If ((ii > 0) And (ii < UBound(thr, 1))) _
And ((jj > 0) And (jj < UBound(thr, 2))) Then
tmp((ii-(row-1)), (jj-(Col-1))) = thr(ii, jj)
Else
Tmp((ii-(row-1)), (jj-(Col-1))) = 255
End If
Next
Next
n = nay8(tmp(), value)
If n >= 2 And n <= 6 Then
If crossing_index(tmp(), value) = 1 Then
If (thr(i-1,j) = 255) Or (thr(i,j+1) = 255) _
Or (thr(i+1,j) = 255) Then
If (thr(i,j+1) = 255) Or (thr(i+1,j) = 255) _
Or (thr(i,j-1) = 255) Then
tht(i, j) = 255
again = 1
End If
End If
End If
End If
End If
Next
Next
thr = tht
For j = 0 To UBound(thr, 2)
For i = 0 To UBound(thr, 1)
If tht(i,j) <> 255 Then
row = i
Col = j
For ii = (row-1) To (row+1)
For jj = (Col-1) To (Col+1)
If ((ii>0) And (ii<UBound(thr,1))) _
And ((jj>0) And (jj<UBound(thr,2))) Then
tmp((ii-(row-1)), (jj-(Col-1))) = thr(ii, jj)
Else
tmp((ii-(row-1)), (jj-(Col-1))) = 255
End If
Next
Next
n = nay8(tmp(), value)
If n >= 2 And n <= 6 Then
If crossing_index(tmp(), value) = 1 Then
If (tht(i-1,j) = 255) Or (tht(i,j+1) = 255) _
Or (tht(i,j-1) = 255) Then
If (tht(i-1,j) = 255) Or (tht(i+1,j) = 255) _
Or (tht(i,j-1) = 255) Then
thr(i, j) = 255
again = 1
End If
End If
End If
End If
End If
Next
Next
tht = thr
Loop Until again = 0
Hasil dari implementasi thinning pada segmentasi di atas akan tersimpan pada array thr.
4.6.5. Procedure Dir_Hist
Pada proses ini, gambar yang sudah melewati tiga proses terdahulu akan dilakukan perhitungan distribusi sudut. Salah satu syarat dalam proses ini adalah,di antara sekeliling pixel target, terdapat minimal satu pixel yang bernilai sama dengan pixel target. Apabila syarat terpenuhi, maka akan dilanjutkan dengan pemetaan distribusi lekuk dari pixel yang ada. Untuk lebih jelas dapat dilihat pada
segment program 4.16.
Segment Program 4.16. Syarat Dalam Pemetaan Distribusi Lekuk
‘if pixel has more than one neighbour
If nay8(tmp(), val) > 1 Then
xx = pixel_dir(mz, i, j)
xx = (xx + 90) / scl
k = CInt(xx)
gh(k) = gh(k) + 1
End If
Agar dapat diketahui sudut yang digunakan dalam pemetaan distribusi lekuk ini, digunakan tiga function tambahan, yaitu function Pixel_Dir, Best_Line, dan Line_Error.
4.6.5.1. Function Pixel_Dir
Pada function ini, gambar yang sudah diolah akan dipetakan terlebih dahulu ke dalam sebuah matriks berukuran mz x mz. Untuk mempermudah, dapat diandaikan bahwa matriks yang digunakan berukuran 5 x 5, sebagai contoh. Setelah proses pemetaan dilakukan, pixel target atau pixel yang berada tepat di tengah matriks akan diubah menjadi nilai satu, dan demikian juga dengan pixel sekelilingnya yang memiliki nilai pixel yang sama serta berhubungan langsung dengan pixel target, akan dirubah menjadi satu. Pada segment program 4.17, akan diperlihatkan coding pemetaan beserta perubahan nilai dari pixel target dengan pixel sekelilingnya.
Segment Program 4.17. Pemetaan Dan Perubahan Nilai Pada Matriks 5 x 5
For ii = (row - 2) To (row + 2)
For jj = (Col - 2) To (Col + 2)
If (ii > 0) And (ii < UBound(thr, 1)) _
And (jj > 0) And (jj < UBound(thr, 2)) Then
r((ii - (row - 2)), (jj - (Col - 2))) = thr(ii, jj)
Else
r((ii - (row - 2)), (jj - (Col - 2))) = 255
End If
Next
Next
r(2, 2) = 1 'the pointer select at the center of the matrix
For k = 0 To 1
For i3 = 0 To 4
For j3 = 0 To 4
If r(i3, j3) <> 1 Then
For ii = -1 To 1
If (i3 + ii >= 0) And (i3 + ii <= 4) Then
For jj = -1 To 1
If (j3 + jj >= 0) And (j3 + jj <= 4) Then
If r((i3 + ii), (j3 + jj)) = 0 Then
r((i3 + ii), (j3 + jj)) = 1
End If
End If
Next
End If
Next
End If
Next
Next
Next
Setelah proses pemetaan dan perubahan nilai dilakukan, langkah selanjutnya adalah mengubah semua nilai yang tidak sama dengan satu menjadi nol. Hal ini dilakukan agar sistem hanya melakukan perhitungan distribusi lekuk pada pixel yang tidak berdiri sendiri.
Segment Program 4.18. Pengalokasian Nilai Don’t Care
k = 0
For i4 = 0 To 4
For j4 = 0 To 4
If r(i4, j4) = 1 Then
k = k + 1
Else
r(i4, j4) = 0
End If
Next
Next
pixel_dir = best_line(r(), mz)
4.6.5.2. Function Best_Line
Setelah proses pemetaan dan perubahan nilai dari function Pixel_Dir, akan dilanjutkan pada function Best_Line. Function Best_Line adalah function yang bertujuan untuk mendapatkan garis terbaik dengan cara mengetes sudut yang dimulai dari sudut -90 derajat sampai dengan 89 derajat.
Segment Program 4.19. Pencarian Garis Terbaik
best = 1000000000# '=>1.0e9
besta = 1000000000# '=>1.0e9
For i3 = 0 To mz - 1
For j3 = 0 To mz - 1
If r(i3, j3) = 1 Then
For angle = -90# To 89# Step 1#
x = line_error(r(), angle, i3, j3, mz)
If x < best Then
best = x
besta = angle
End If
Next
End If
Next
Next
best_line = besta
Pada proses inisialisasi pada function ini, terlihat bahwa untuk variabel best dan besta diberi nilai yang sangat tinggi, yaitu satu milyar. Hal ini dilakukan, karena mengingat pada proses ini, nilai terkecil menjadi tujuan dari proses ini.
4.6.5.3. Function Line_Error
Pada function Best_Line terlihat bahwa function ini memanggil function Line_Error. Function ini bertujuan untuk mengecek apakah garis yang diberikan oleh function Best_Line dengan sudut tersebut, dapat dikategorikan garis yang terbaik. Hasil dari function ini, adalah jumlah error yang dihasilkan oleh garis yang dikirimkan oleh function Best_Line. Untuk proses pengecekan, pada segment program 4.20, dapat terlihat persamaan matematis dari rumus garis lurus.
Untuk lebih jelasnya dapat dilihat pada segment program berikut.
Program 4.20. Function Line_Error
angle1 = angle * PI / 180#
a = Cos(angle1 + (PI / 2#))
b = Sqr(1# - (a * a))
C = (-ii * a) - (jj * b)
sum = 0#
For i3 = 0 To (mz - 1)
For j3 = 0 To (mz - 1)
If r(i3, j3) = 1 Then
sum = sum + Abs((a * i3) + (b * j3) + C)
End If
Next
Next
line_error = sum
4.7. Proses Perbandingan Histogram
Untuk proses perbandingan histogram, digunakan dua function, yaitu function Hist_Dist dan function Dot.
4.7.1. Function Hist_Dist
Function Hist_Dist merupakan function utama dari proses perbandingan histogram. Dasar dari function ini adalah dengan menggunakan rumus D = a.b / (a.a+b.b-a.b). Pada rumus ini, setiap titik pada histogram akan diperlakukan sebagai vektor, sehingga pada rumus di atas, titik merupakan operasi perkalian vektor. Pada segment program 4.21, dapat dilhat coding dari function ini.
Segment Program 4.21. Function Hist_Dist
Function hist_dist(h1() As Long, h2() As Long) As Double
Dim a As Long, b As Long, c As Long, dist As Double
a = dot(h1, h1, 45) 'a.a
b = dot(h2, h2, 45) 'b.b
c = dot(h1, h2, 45) 'a.b
dist = CDbl(c) / (CDbl(a + b - c)) 'D's formulas
hist_dist = dist
End Function
Pada source code segment program 4.21, baik variabel h1 dan h2 merupakan data histogram. H1 adalah variabel yang mengindikasikan file histogram yang pertama, sedang h2 adalah variabel yang mengindikasikan file histogram yang kedua. Hasil dari function ini, akan berkisar antara nol sampai dengan satu.
4.7.2. Function Dot
Function Dot merupakan function bantuan untuk melakukan operasi perkalian vektor. Untuk lebih jelasnya dapat dilihat pada segment program 4.21.
Segment Program 4.22. Function Dot
Function dot(a() As Long, b() As Long, n As Byte) As Long
k = 0
For I = 0 To n
k = k + (a(I) * b(I))
Next
dot = k
End Function
Belum ada tanggapan untuk "Image Processing"
Posting Komentar