You are on page 1of 10

[sharing is caring]

2011

DETEKSI KARAKTER PADA CITRA DIGITAL (OCR) DENGAN TEKNIK KORELASI (TEMPLATE MATCHING)

Pada artikel ini saya akan membahas bagaimana melakukan deteksi karakter yang terdapat pada citra digital (OCR). Perlu diingat bahwa OCR karakternya bukan tulisan tangan. Jadi ambil saja contoh halaman buku yang di scan. Apa yang saya hadirkan di sini hanya demo saja, karena sampel atau data yang saya gunakan sangat sedikit karena untuk menunjukkan bahwa template matching bisa digunakan untuk tujuan ini. Namun akan saya beberkan kelebihan dan kekurangan menggunakan metode ini. Korelasi merupakan sebuah teknik yang digunakan untuk menguji kedekatan atau erat tidaknya sebuah data dengan data yang lain. Metode ini digunakan dibanyak kasus, bisa dalam pengolahan isyarat, analisis data atau untuk pengolahan citra seperti yang sedang kita bahas. Sebenarnya masih sangat banyak aplikasi yang menggunakan metode ini baik hanya sebagai tambahan atau merupakan komponen utamanya. Korelasi merupakan metode yang tergabung dalam penamaan template matching. Mengapa demikian? Seperti yang sudah saya katakan bahwa korelasi menguji kedekatan sebuah data dengan data yang lain. Dengan kata lain kita memiliki data yang sudah menjadi referensi untuk dibandingkan dengan data yang akan diuji. Selain korelasi, ada juga teknik yang termasuk dalam template matching yakni jarak Euclidean (euclidean distance) yang juga bertugas dengan cara yang mirip. Perlu diketahui bahwa template matching digunakan sebagai teknik klasifikasi, bukan teknik untuk ekstraksi ciri. Ekstraksi ciri merupakan sebuah syarat untuk dapat melangkah ke langkah klasifikasi. Jika seandainya ekstraksi ciri tidak dilakukan bisa saja menghasilkan keluaran yang kita inginkan, tapi dikhawatirkan sistem tidak stabil. Selain itu, komputasi dari program bisa menjadi sangat besar walaupun hal itu tidak menjadi masalah lagi karena komputer saat ini sudah memiliki kemampuan dalam mengolah data dengan sangat cepat. Ekstraksi ciri bisa menggunakan algoritma apa saja, sebisa mungkin disesuaikan dengan kasus kita baik itu goal nya atau pun memperhitungkan permasalahan apa saja yang akan terjadi ketika membangun sistem ini. Sistem yang saya maksud adalah program kita. Template Matching memiliki kelebihan dan kekurangan. Kelebihannya adalah metode ini sangat mudah untuk dituliskan ke dalam program. Begitu juga dengan kemudahan untuk mempersiapkan data referensinya. Dengan menggunakan korelasi 2 dimensi (karena datanya merupakan matriks) bisa dikatakan bahwa komputasi tidak terlalu besar. Ada lagi??? Bisa saja ada, silahkan anda uji sendiri. Namun, dibalik kelebihannya itu metode ini secara umum memiliki kekurangan. Sesuai dengan namanya saja, bisa ditebak bahwa kita memang membutuhkan data referensi yang bisa kita sebut sebagai basis data. Basis data ini bisa berupa citra ataupun citra yang telah dijadikan matriks. Semakin banyak jenis font yang ingin kita deteksi, maka semakin banyak data referensi yang harus disimpan. Pada kasus ini saya tidak menggunakan ekstraksi ciri walau sebelumnya saya juga sudah menggunakan skeleton dan tepi objek sebagai cirinya. Hanya itu akan menjadi improvisasi saja bagi yang mau. Dalam artikel ini saya mencoba memberikan gambaran bagaimana membuat program bila menggunakan

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 1

[sharing is caring]

2011

template matching atau bisa dikembangkan jika membutuhkan algoritma lain untuk ekstraksi ciri dan klasifikasinya. Korelasi 2 dimensi menggunakan persamaan ini:

Dua buah data dianggap memiliki kedekatan besar apabila korelasinya memberikan nilai mendekati 1. Jadi jika sebuah data yang akan diuji di korelasikan dengan sebuah matriks berukuran besar yang isinya merupakan berbagai template, maka dipilih nilai korelasi terbesar yang menjadi pemenangnya. Dalam program ini, saya menggunakan profile projection sebagai detektor baris dari citra dan menggunakan pusat titik massa (centroid) sebagai cara pemotongan perkarakter. Kemudian karakter yang telah dipotong diubah ukuran nya menjadi 50 x 70 agar bisa dikorelasikan dengan template karena syarat dari korelasi adalah ukuran data harus sama. Berikut ini adalah langkah-langkah dalam pembuata program. Perlu diketahui bahwa ada dua kategori program yang dibuat, 1) untuk pembuatan template 2) untuk memproses 1) Pembuatan template Langkah-langkahnya: - Saya membuat sebuah citra yang isinya alphabet dari A-Z dan angka dari 0-9 dengan ketentuan Font : ARIAL dan size : 20.

Lalu dengan menggunakan teknik vertical profile projection saya memotong citra tersebut menjadi 3 baris. Tiap pemotongan baris, saya akan mencari centroid (titik pusat massa) lalu crop sesuai dengan bounding box tiap centroid tersebut. Lalu tiap karakter hasil pemotongan di resize menjadi 50 x 70. Lalu hasil resize akan disimpan pada sebuah matriks secara berurutan sesuai dengan gambar di atas. Tujuannya adalah ketika melakukan korelasi, pemenang dari korelasi akan otomatis menunjukkan indeks dari karakter tersebut. Sehingga program akan semakin mudah untuk dirunut alurnya.

[sharing is caring]

2011

Berikut ini adalah program untuk penyimpanan dalam databasenya.


% program for making database clear all; close all; clc; %% reading image filename='arialsm.png'; I = imread(filename); level=graythresh(I); I=im2bw(I,level); Ib=I; imshow(I); title('Original Image with Vertical Projection'); hold on; I=~I; [bar,kol]=size(I); %% %% horisontal projeksi Y=sum(I,2); koY=1:bar; plot(Y,1:bar); hold off; %% %% pemotongan untuk baris line1=zeros(1,bar); line2=zeros(1,kol); k1=length(Y); k=1; for ii=2:k1-1 if Y(ii)==0 if Y(ii+1)~=0 line1(k)=koY(ii+1); elseif Y(ii-1)~=0 line1(k)=koY(ii-1); end k=k+1; end end line1=line1(line1~=0); km=0; for k=1:2:length(line1) Ik=imcrop(I,[1 line1(k) kol line1(k+1)-line1(k)]); Id=Ik; % Ik=bwmorph(Ik,'dilate'); bw=bwconncomp(Ik,4);

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 3

[sharing is caring]

2011

bw=labelmatrix(bw); stats=regionprops(bw,{'centroid','boundingbox'}); for kk=1:length(stats); cent=stats(kk).Centroid; boks=stats(kk).BoundingBox; plot(cent(1),cent(2),'bo','MarkerSize',5,'MarkerFaceColor','g'); rect=[boks(1),boks(2),boks(3),boks(4)]; In=imcrop(Id,rect); In=imresize(In,[50 70],'cubic'); In=bwmorph(In,'remove'); In=~In; imwrite(In,sprintf('image%d.tif',km),'tif'); [x,y]=size(In); A(:,y*km+1:(km+1)*y)=In; km=km+1; end

end hold off; save temp_char.mat A

hasil dari program tersebut seharusnya berupa matriks dengan ukuran 50x2520. Perlu diketahui bahwa arialsm.png merupakan nama citra di atas. Matriks yang saya maksud diberi nama A dan disimpan pada mat-file yakni temp_char.mat dengan tujuan agar bisa dipanggil kapanpun dibutuhkan. Dalam code di atas, saya tambahkan juga bagian untuk menyimpan citra dalam format tiff ke dalam harddisk. Hasil pemotongan itulah yang disimpan. Sehingga anda bisa melakukan pembandingan dan uji apakah hasil pemotongan sudah benar atau belum. Jika dalam bentuk matriks, tentu akan sulit untuk observasi bukan????

2) Untuk mengolah data Program ini akan kita gunakan untuk deteksi karakter pada OCR tersebut. Langkahlangkah nya adalah: - Siapkan citra uji dan import ke dalam matlab - Terapkan kembali vertical profile projection untuk mendapatkan baris - Potong tiap karakter pada citra dengan menggunakan centroid - Lakukan korelasi 2 dimensi antara referensi dengan citra uji - Cari nilai maksimal untuk tiap kali korelasi dijalankan, maka indeks tempat nilai maksimum tersebutlah akan menjadi penentu pemenang. Maksudnya, dengan menggunakan IF ELSE maka kita bisa mencocokkan hasil dengan data sebenarnya. Berikut ini adalah programnya. Program terdiri dari 2 buah, untuk korelasi dan main program. Main programnya adalah

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 4

[sharing is caring]

2011

clear all; close all; clc; warning off; filename='arialsm7.png'; I=imread(filename); [x,y,z]=size(I); if z>1 I=rgb2gray(I); end if ~islogical(I) level=graythresh(I); I=im2bw(I,level); end Ib=I; imshow(I); title('Original Image with Vertical Projection'); hold on; I=~I; [bar,kol]=size(I); %% %% making text object fid = fopen('OCR.txt', 'wt'); %% %% horisontal projeksi Y=sum(I,2); koY=1:bar; % plot(Y,1:bar); hold off; %% %% pemotongan untuk baris line1=zeros(1,bar); line2=zeros(1,kol); k1=length(Y); k=1; for ii=2:k1-1 if Y(ii)==0 if Y(ii+1)~=0 line1(k)=koY(ii+1); elseif Y(ii-1)~=0 line1(k)=koY(ii-1); end

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 5

[sharing is caring]

2011

k=k+1; end end line1=line1(line1~=0); word=[]; kd=0; for k=1:2:length(line1) Ik=imcrop(I,[1 line1(k) kol line1(k+1)-line1(k)]); Id=Ik; % Ik=bwmorph(Ik,'dilate'); bw=bwconncomp(Ik,4); bw=labelmatrix(bw); stats=regionprops(bw,{'centroid','boundingbox'}); for kk=1:length(stats); cent=stats(kk).Centroid; plot(cent(1),cent(2),'bo','MarkerSize',5,'MarkerFaceColor','g'); boks=stats(kk).BoundingBox; rect=[boks(1),boks(2),boks(3),boks(4)]; In=imcrop(Id,rect); In=imresize(In,[50 70],'cubic'); In=bwmorph(In,'remove'); In=~In; imwrite(In,sprintf('hasil%d.tif',kd),'tif'); [x,y]=size(In); huruf=read_char(In,y); word=[word huruf]; kd=kd+1; end fprintf(fid,'%s\n',word); word=[];

end fclose(fid); winopen('OCR.txt');

program korelasi 2 dimensinya adalah


function huruf=read_char(In,y) load temp_char.mat mat1=[]; for kk=0:35 kor=corr2(A(:,y*kk+1:(kk+1)*y),In);

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 6

[sharing is caring]

2011

mat1=[mat1 kor]; end idx=find(mat1==max(mat1)); %*-*-*-*-*-*-*-*-*-*-*-*-*if idx==1 huruf='A'; elseif idx==2 huruf='B'; elseif idx==3 huruf='C'; elseif idx==4 huruf='D'; elseif idx==5 huruf='E'; elseif idx==6 huruf='F'; elseif idx==7 huruf='G'; elseif idx==8 huruf='H'; elseif idx==9 huruf='I'; elseif idx==10 huruf='J'; elseif idx==11 huruf='K'; elseif idx==12 huruf='L'; elseif idx==13 huruf='M'; elseif idx==14 huruf='N'; elseif idx==15 huruf='O'; elseif idx==16 huruf='P'; elseif idx==17 huruf='Q'; elseif idx==18 huruf='R'; elseif idx==19 huruf='S'; elseif idx==20 huruf='T'; elseif idx==21 huruf='U'; elseif idx==22

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 7

[sharing is caring]

2011

huruf='V'; elseif idx==23 huruf='W'; elseif idx==24 huruf='X'; elseif idx==25 huruf='Y'; elseif idx==26 huruf='Z'; elseif idx==27 huruf='0'; elseif idx==28 huruf='1'; elseif idx==29 huruf='2'; elseif idx==30 huruf='3'; elseif idx==31 huruf='4'; elseif idx==32 huruf='5'; elseif idx==33 huruf='6'; elseif idx==34 huruf='7'; elseif idx==35 huruf='8'; else huruf='9'; end

ingat! Simpanlah fungsi di atas dengan nama yang sama dengan nama fungsi yakni read_char. Hasil pengujian akan disimpan dalam NOTEPAD yang isinya adalah karakter yang telah dibaca oleh program. Beberapa pengujian yang saya lakukan adalah: 1) Pengujian dengan template

[sharing is caring]

2011

2) Pengujian dengan citra baru yang ukurannya karakter nya 20

3) Pengujian dengan citra yang ukuran karakternya bervariasi 14,16 dan 18.

4) Pengujina dengan citra yang ukuran karakternya bervariasi dari 10, 11 dan 12.

[sharing is caring]

2011

Analisa hasil : data uji terakhir menunjukkan kegagalan dari program. Ini sangat wajar karena data uji memiliki ukuran yang cukup kecil dan tipis sehingga ketika kita menggunakan centroid dari matlab, dia tidak bisa benar-benar memisahkan karakter-karater tersebut. Sejauh ini saya hanya melakukan uji ringan dan sederhana pada program yang sudah dibuat. Kunci dari keberhasilan dalam membuat program seperti ini ataupun bila ingin modifikasi adalah pada ekstraksi ciri juga pemotongan pada karakter. Karena saya memiliki ide jika seandainya saya menambahkan horisontal profile projection lalu hasilnya saya potong lagi menggunakan bounding box pada centroid mungkin akan dihasilkan nilai maksimal. Sehingga ada kemungkinan besar data uji bisa berbeda jenis fontnya. Tidak harus arial dan ukurannya bisa lebih kecil sesuai dengan standar penulisan dokumen pada karya ilmiah atau yang sejenis. Mungkin dua syarat tersebut bisa anda uji jadikan note penting dalam pengembangan, sementara template matching untuk sementara ini bisa kita anggap masih mampu untuk menangani permasalahan seperti ini. Untuk saat ini, saya rasa cukup penjelasan dan keterangan dari program yang sudah saya buat. Memang saya akui masih jauh dari well kualitas dari program ini. Namun dengan sedikit waktu saja saya usahakan untuk membuat program ini dan menunjukkan langkah-langkahnya. Setidaknya anda tau darimana akan melangkah. Untuk citra yang asli hasil scan, bila kualitasnya memang kurang bagus ada baiknya memberikan pre-processing berupa penapisan (filter) dan pengaturan kontras warna. Hasil dari pre-processing ini dijadikan masukan kepada program pengolah. Terima kasih atas kesediaannya untuk membaca artikel ini.

@thanks

[{EE&IT UGM, Indonesia} janshendry@gmail.com]

Page 10

You might also like