Anda di halaman 1dari 9

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

SEGMENTASI CITRA BARCODE EAN-13 #1

Artikel ini akan membahas salah satu cara untuk melakukan segmentasi pada citra barcode EAN-13. Barcode bukan merupakan hal baru atau pun baru didengar. Terlalu banyak aplikasi ini digunakan dalam kehidupan sehari-hari. Perhatikan saja pada supermarket, toko-toko bahkan industri manufaktur juga menggunakan ini. Tujuannya tentu dalam hal kecepatan dan ketepatan. Bayangkan saja jika kita memilih contoh sebuah supermarket yang besar, dengan antrian konsumen yang banyak andai saja perhitungan harga total barang yang dibeli dilakukan secara manual seperti di warung-warung tentu akan membutuhkan waktu yang lama. Dengan demikian, antrian akan semakin panjang dan membuat konsumen bosan ditambah lagi besarnya kemungkinan kesalahan yang terjadi. Kesalahan perhitungan bisa menyebabkan kerugian pada konsumen atau malah pada penjual sendiri. Untuk itu dicoba mencari solusi yang tepat untuk permasalahan tersebut. Dengan demikian barcode lahir dengan tujuan salah satunya menjadi penyelesaian terhadap kasus yang saya jelaskan di atas.

Susunan barcode terdiri atas garis-garis hitam tebal-tipis, diselingi dengan spasi dan biasanya ada angka-angka dibagian bawah. Sebuah alat yang menggunakna sinar laser digunakan untuk mendeteksi kode yang tersembunyi pada barcode. Banyak teknik yang dikembangkan untuk memberikan hasil dan kecepatan deteksi sebuah barcode detector. Para ahli pengolahan citra juga ikut serta untuk mengembangkan algoritma-algoritma yang tepat. Tentu para ahli perlu melakukan simulasi terlebih dahulu terhadap algoritma yang mereka kembangkan sebelum di implementasikan pada perangkat keras. Simulasi tersebut melibatkan beberapa jenis bahasa pemrograman, salah satunya matlab. Untuk itulah kita akan mencoba melakukan identifikasi terhadap barcode yang ada dengan menggunakan beberapa algoritma cerdas. Namun sebelum beranjak pada tingkatan tersebut, terlebih dahulu kita melakukan pra pengolahan terhadap citra barcode. Karena justru pada tingkatan ini performa dari detektor kita akan teruji dengan baik. Setidaknya tingkatan ini akan mengurangi beban kerja dari algoritma cerdas yang akan kita coba gunakan.

Pada artikel ini, kita hanya akan membahas mengenai segmentasi pada citra barcode. Segmentasi yang dimaksud adalah memisahkan garis-garis tebal-tipis dari latar belakang. Perlu diingat bahwa kita hanya membutuhkan garis-garis tersebut. Sehingga selain dari itu, dapat kita hapus atau abaikan.

Perhatikan beberapa contoh dari citra barcode di bawah ini. Citra ini dibuat menggunakan barcode generator, jadi tidak ada derau pada citranya. Hal ini agar pembuatan program dapat diselesaikan terlebih dahulu, sehingga koreksi program dapat dilakukan secara keseluruhan ketika kita menguji dengan citra yang asli (misalnya memiliki derau).

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011
[ jans hendry & Salman Aliaji ] November 11, 2011 [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &
[ jans hendry & Salman Aliaji ] November 11, 2011 [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011
[ jans hendry & Salman Aliaji ] November 11, 2011 [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &
[ jans hendry & Salman Aliaji ] November 11, 2011 [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

Penjelasan mengenai barcode sendiri akan diberikan pada artikel lainnya, agar penjelasan tersebut bisa diberikan secara menyeluruh dan rinci.

Dalam segmentasi pada artikel ini, teknik yang kami gunakan adalah profile projection, centroid. Kami menghindari penggunaan filter karena akan mempengaruhi barcode tersebut. Sementara itu, ukuran garis-garis pada barcode sangat berpengaruh. Dengan menggunakan filter, dikhawatirkan akan menghilangkan informasi yang penting dalam barcode. Untuk itu kami menggunakan trik dimana jumlah piksel dari sebuah objek yang kurang dari nilai tertentu akan kami buang. Mengapa??? Karena pada dasarnya jumlah piksel pada garis-garis tentu sangat besar bila dibandingkan dengan angka-angka yang ada dibawahnya. Sehingga teknik ini bisa digunakan dan memberikan hasil yang memuaskan.

Pada dasarnya yang akan dilakukan disini merupakan salah satu cara untuk memproses barcode untuk diidentifikasi. Bisa saja dengan langsung melakukan proses pengolahan terhadap citra secara keseluruhan tanpa harus disegmentasi dan diterjemahkan ke dalam bit-bit yang merepresentasikan angka 0-9 dan disesuaikan dengan Kelas A, B dan C. Kelas-kelas yang saya maksud merupakan aturan yang dapat digunakan untuk memetakan bit-bit ke dalam desimal. Jadi bukan dengan melakukan konversi biner ke desimal biasa. Untuk lebih jelasnya, hal tersebut akan dihadirkan pada artikel tentang barcode lengkap dengan deteksinya. Artikel ini merupakan pra-pengolahan saja dan tentunya merupakan kunci agar algoritma klasifikasi nanti bisa berjalan dengan baik. Pada artikel lain akan dicoba dihadirkan cara lain untuk segmentasi barcode ini.

Perhatikan program berikut ini:

clear all;

close all;

clc;

warning off;

%% import gambar

filename='barcode1.bmp';

% filename='barcode2.bmp';

% filename='barcode3.bmp';

% filename='055555555555.bmp';

I = imread(filename); [bar,kol]=size(I);

level=graythresh(I);

bw=im2bw(I,level);

% imshow(bw);

% title('Original Barcode Image');

bw=~bw;

%%

%% membuang piksel yang ukurannya kurang dari 110

bw=bwareaopen(bw,110);

bw2=~bw;

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

% figure, imshow(bw2);

% title('Filtered Barcode');

% hold on;

%%

%% projeksi horisontal dan vertikal

X=sum(bw,1);

koX=1:kol/3;

Y=sum(bw,2);

koY=1:bar;

% plot(Y,koY,'r',koX,X,'g');

% hold off;

%%

%% memotong sisi pingggir dari citra

[bar1,kol1]=find(X>0);

[bar2,kol2]=find(Y>0);

rect=[kol1(1) bar2(1) kol1(end)-kol1(1) bar2(end)-bar2(1)];

bw=imcrop(bw2,rect);

bw2=~bw;

figure, imshow(bw); title('Cropped Image'); hold on; %%

%% pembagian sisi kiri dan kanan barcode

bw2=bwconncomp(bw2,8);

bw2=labelmatrix(bw2);

pusat=regionprops(bw2,{'centroid','boundingbox'});

for k=1:length(pusat); sent=pusat(k).Centroid; boks(k,:)=pusat(k).BoundingBox;

plot(sent(1),sent(2),'r*','MarkerSize',2,'MarkerFaceColor','g');

bx=[boks(k,1),boks(k,1),boks(k,1)+boks(k,3),boks(k,1)+boks(k,3),boks(k,1)];

by=[boks(k,2)+boks(k,4),boks(k,2),boks(k,2),boks(k,2)+boks(k,4),boks(k,2)+boks(k,4)];

line(bx,by,'color','r');

selby(k,1)=abs(boks(k,4)-boks(k,2));

selbx(k,1)=abs(boks(k,1)-boks(k,3));

end

hold off;

maksy=max(selby);

[bbar,kkol]=find(selby>=maksy-3);

%%

%% pemotongan sisi kiri dan kanan

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

[bar,kol]=size(bw);

n=4;

% piksel

r=1;

m=2;

while m<=3 if m==2 rect1=[boks(bbar(2*m-2),1)+boks(bbar(2*m-2),3) 0

boks(bbar(m+1)-1,1)+boks(bbar(m+1)-1,3)-(boks(bbar(2*m-2),1)+boks(bbar(2*m-

2),3))

kol]; ttl=' kiri'; else rect1=[boks(bbar(2*m-2)+1,1) 0

boks(bbar(m+2),1)-boks(bbar(2*m-2)+1,1)

kol]; ttl=' kanan'; end

bw3{r}=imcrop(bw,rect1);

figure, imshow(bw3{r}); title(strcat('Citra Sisi',ttl)); rrect=[0 round(size(bw3{r},1)/2) size(bw3{r},2)-1 n-1];

bw4{r}=imcrop(bw3{r},rrect);

bw4{r}=imresize(bw4{r},[size(bw4{r},1)

42],'cubic');

figure, imshow(bw4{r},'InitialMagnification','fit')

m=m+1;

r=r+1;

end

%%

%% pemotongan menjadi 6x7

kiri=(~bw4{1})';

kanan=(~bw4{2})';

kiri=reshape(kiri,1,size(kiri,1)*size(kiri,2));

kanan=reshape(kanan,1,size(kanan,1)*size(kanan,2));

m=0;

jj=1;

ii=1;

while ii<=size(bw4{1},2)/7 for m=0:n-1

kiribw(ii,7*(m+1)-6:7*(m+1))=kiri(1,(7*jj-6)+42*(m):7*jj+42*(m));

kananbw(ii,7*(m+1)-6:7*(m+1))=kanan(1,(7*jj-6)+42*(m):7*jj+42*(m));

end

jj=jj+1;

end

ii=ii+1;

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

disp('Matriks Kiri'); disp(kiribw);

disp('Matriks Kanan'); disp(kananbw); %%

Dengan mengambil contoh barcode-1, maka hasil program di atas adalah:

contoh barcode-1, maka hasil program di atas adalah: Citra dengan pola angka-angka yang sudah dibuang.

Citra dengan pola angka-angka yang sudah dibuang.

adalah: Citra dengan pola angka-angka yang sudah dibuang. [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

Citra setelah dipotong tepinya.

] November 11, 2011 Citra setelah dipotong tepinya. Citra barcode sisi kiri, antara batas tepi kiri

Citra barcode sisi kiri, antara batas tepi kiri dan batas tengah (101 dan 01010).

antara batas tepi kiri dan batas tengah (101 dan 01010). [{EE&IT of UGM, Indonesia} jans.hendry@gmail.com] &

[jans hendry & Salman Aliaji]

[ jans hendry & Salman Aliaji ] November 11, 2011

November 11, 2011

[ jans hendry & Salman Aliaji ] November 11, 2011

Bila citra barcode dipotong sebesar 1 piksel.

11, 2011 Bila citra barcode dipotong sebesar 1 piksel. Citra barcode sisi kanan, antara batas tengah

Citra barcode sisi kanan, antara batas tengah dan batas tepi kanan (01010 dan 101).

antara batas tengah dan batas tepi kanan (01010 dan 101). Bila citra barcode dipotong sebesar 1

Bila citra barcode dipotong sebesar 1 piksel.

dan 101). Bila citra barcode dipotong sebesar 1 piksel. Hasil pembacaan dari barcode masih dalam kode

Hasil pembacaan dari barcode masih dalam kode biner dengan ukuran masing-masing matriks kiri dan kanan 6 x 7. Karena ada 6 kode kiri dan 6 kode kanan.

dan kanan 6 x 7. Karena ada 6 kode kiri dan 6 kode kanan. @thanks [{EE&IT

@thanks