deteksi-tulisan-dalam-citra-digital-dan-menghitung-jumlah-karakternya-menggunakan-matlab
DESCRIPTION
Deteksi-Tulisan-Dalam-Citra-Digital-dan-Menghitung-Jumlah-Karakternya-Menggunakan-MatlabTRANSCRIPT
1 [Jans Hendry / EE UGM, Indonesia]
Kasus: MENGHITUNG JUMLAH KARAKTER (ALPHABET ATAU BILANGAN)
DI DALAM CITRA DIGITAL
Kasus yang saya hadirkan disini adalah bagaimana cara menghitung jumlah karakter (alphabet atau
angka) dalam sebuah citra digital. Permasalahan ini cukup penting ketika kita berurusan dengan
projek untuk mengklasifikasikan karakter yang terdapat dalam citra. Ambil saja contoh dalam
mengartikan tulisan yang ada di dalam citra hasil scan. Dengan menghitung jumlah karakter yang
ada di dalamnya, iterasi akan bisa digunakan sebagai salah satu langkah pembacaan sehingga proses
nya akan menjadi otomatis tidak lagi manual (misalnya pemotongan manual atau cropping).
Dalam artikel ini, saya juga menyertakan bagaimana matlab dapat digunakan untuk memotong tiap
karakter secara otomatis sesuai persis dengan ukurannya. Pada artikel yang lain, saya telah
membuatkan sebuah algoritma untuk melakukan pemotongan secara otomatis. Tentu saja algoritma
tersebut bisa digunakan sebagai ‘gaya tersendiri’ ☺.
Langkah-langkah yang digunakan adalah:
- Membaca citra digital
- Cek apakah citra berupa RGB atau grayscale atau biner. Jika citra dalam bentuk RGB atau
Grayscale maka kita jadikan biner terlebih dahulu.
- Memberikan label terhadap objek yang ada di dalam citra untuk memisahkan masing-masing
objek.
- Mencari centroid atau titik massa (istilah kerennya dari saya) untuk tiap objek.
- Untuk tiap centroid yang ditemukan, kita berikan kotak yang menandakan bahwa dia telah
terklasifikasi. Kotak ini sebenarnya hanya aksesoris saja, yang ingin saya jelaskan adalah
dengan menggunakan parameter untuk membuat kotak (bounding box) ini kita bisa
melakukan teknik pemotongan secara otomatis dan presisi atau akurat.
- Lalu tampilkan semua hasil pengolahan tersebut dalam figure yang sama.
Baik, dengan mengetahui langkah-langkah di atas maka kita bisa membuat program yang cocok
dengan permasalahan yang telah saya utarakan di atas. Program ini akan saya gunakan juga dalam
projek mendeteksi karakter dalam citra hasil scan seperti yang telah saya utarakan pada artikel
sebelumnya.
Dalam kasus ini, saya menggunakan citra digital:
2 [Jans Hendry / EE UGM, Indonesia]
Yang ingin kita lakukan adalah menghitung jumlah karakter valid di dalam citra tersebut. Program
beserta penjelasannya adalah sebagai berikut:
- Membaca citra digital
filename='font4.png'; I=imread(filename);
- Cek apakah citra berupa RGB atau grayscale atau biner. Jika citra dalam bentuk RGB atau
Grayscale maka kita jadikan biner terlebih dahulu.
[bar,kol,z]=size(I); if z==3 bw=im2bw(I,.5); else bw=I; end bw=~bw;
- Memberikan label terhadap objek yang ada di dalam citra untuk memisahkan masing-masing
objek. Sebelum memberikan label, terlebih dahulu kita menghitung connectivity piksel nya
untuk memisahkan dengan objek yang lain. Saya menggunakan conn-4 karena saya berharap
bahwa ada karakter yang mengalami kontinuitas dalam diagonal neighboorhood (ND).
Mengapa saya berharap? Karena dengan menganggap akan terjadi hal demikian, saya bisa
mengantisipasinya dengan memberikan conn-4 bukan conn-8. Bingung yah??? ☺
bw=bwconncomp(bw,4); bw=labelmatrix(bw);
- Mencari centroid atau titik massa (istilah kerennya dari saya) untuk tiap objek.
stats=regionprops(bw,{'centroid','boundingbox'});
- Menampilkan gambar asli atau original.
imshow(I); title('How to count characters in an image','fontsize',14); hold on;
- Untuk tiap centroid yang ditemukan, kita berikan kotak yang menandakan bahwa dia telah
terklasifikasi. Kotak ini sebenarnya hanya aksesoris saja, yang ingin saya jelaskan adalah
dengan menggunakan parameter untuk membuat kotak (bounding box) ini kita bisa
melakukan teknik pemotongan secara otomatis dan presisi atau akurat.
for k=1:length(stats); cent=stats(k).Centroid; boks=stats(k).BoundingBox; plot(cent(1),cent(2),'bo','MarkerSize',5,'MarkerFaceColor','g'); bx=[boks(1),boks(1),boks(1)+boks(3),boks(1)+boks(3),boks(1)];
3 [Jans Hendry / EE UGM, Indonesia]
by=[boks(2)+boks(4),boks(2),boks(2),boks(2)+boks(4),boks(2)+boks(4)]; line(bx,by,'color','r'); pause(.01); end
- Mengakhiri proses
xlabel(sprintf('There is %d characters counted',length(stats))); hold off;
Hasil eksekusi dari program di atas adalah
% originale by jans hendry % EE of UGM, Indonesia
~~~ TERIMA KASIH ~~~