Algorithma Sederhana Pengenalan Pattern Kotak
Ilustrasi Kuisioner (Sumber: Pixabay/TeroVesalainen) |
Baru-baru ini, ketika tulisan ini ditulis, penulis mencoba mengimplementasikan algorithma pengenalan pattern.
Konon, pengenalan pattern ini telah banyak digunakan dalam kontek Machine Learning, seperti dalam pengenalan wajah, bentuk, mobil, handwriting recognition dan lain sebagainya.
Dan banyak juga library pihak ketiga yang dapat digunakan dan gratis, jika ingin membuatnya menjadi sebuah software.
Meskipun banyak orang menyarankan penggunaan library pihak ketiga tersebut, namun karena memang penulis semenjak dulu tidak berkeinginan untuk menggunakan aplikasi pihak ketiga apapun di software milik penulis, penulis sebisa mungkin membuatnya sendiri.
Alasan kenapa penulis anti dengan library atau aplikasi pihak ketiga, kecuali terpaksa, dapat dilihat pada posting penulis yang berjudul "Anti Library Pihak Ketiga".
Sebagai permulaan untuk belajar pengenalan pattern, pattern yang coba penulis kenali adalah pattern kotak.
Tentu karena penulis rasa bentuk tersebut adalah mudah.
Selain itu, object yang dicocokkan sebagai percobaan adalah berupa kuisioner, dengan pola pilihan jawaban kotak.
Berikut ini adalah cuplikan kode Java, yang menunjukkan implementasi pencoccokan per pixel antara gambar sumber (source) dengan gambar pattern:
BufferedImage source = new BufferedImage(image.getWidth(null),image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D bGr = source.createGraphics(); bGr.drawImage(image, 0, 0, null); BufferedImage pattern= new BufferedImage(pattern_image.getWidth(null),pattern_image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D bGr2 = pattern.createGraphics(); bGr2.drawImage(pattern_image, 0, 0, null); int nextj=0,num=0; for(int j=0;j<source.getHeight();j++){ for(int i=0;i<source.getWidth();i++){ int sama=0,semua=0,val=0; for(int io=0;io<pattern.getWidth();io++){ for(int jo=0;jo<pattern.getHeight();jo++){ int xo=i+io; int yo=j+jo; if(xo>=0 && yo>=0 && xo<source.getWidth() && yo<source.getHeight()){ Color c = new Color(source.getRGB(xo,yo),true); Color c2 = new Color(pattern.getRGB(io,jo),true); if(c.getAlpha()>0){ int r=c.getRed(); int g=c.getGreen(); int b=c.getBlue(); r=(int)(1.0*(r+b+g)/3); if(r<0)r=0; if(r>255)r=255; if(r<BTSPIXEL){ val++; } if(c2.getAlpha()>0){ int r2=c2.getRed(); int g2=c2.getGreen(); int b2=c2.getBlue(); r2=(int)(1.0*(r2+b2+g2)/3); if(r2<0)r2=0; if(r2>255)r2=255; if(r<BTSPIXEL && r2<BTSPIXEL){ sama++; } semua++; } } } } } if(semua>0 && (1.0*sama/semua)>0.8){ //tambahkan fungsi jika kecocokan pattren 80% i+=pattern.getWidth(); } num++; } if(j<nextj)j=nextj; } bGr.dispose(); bGr2.dispose();
Kode ini adalah kode yang penulis implementasikan pada software My Scanner 2.0 penulis.
Komentar
Posting Komentar