Friday, October 31, 2014

Using JNI on OSX

JNI is the way Java using the other programming language. JNI is cool because it's executed a lot faster.

There's a tutorial from NTU, but it's using Windows as it's platform. Sadly I am using *nix. *sob*. But sad no more, I've managed how to use it.
Oh yeah, this tutorial is based on the NTU's tutorial and Kemp's tutorial

1. Create the Java code. For simplicity on this tutorial I named it as HelloJni.java

public class HelloJni{
	
	static{
		System.loadLibrary("HelloJni");
	}

	private native void sayHello();

	public static void main(String args[]){
		new HelloJni().sayHello();
	}

}

then compile this code. Run this on your terminal

javac HelloJni.java

2. Create the header file of C/C++
javah HelloJni

it will create HelloJni.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloJni */

#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJni
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJni_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


3. Create the implementation file

HelloJniImpl.h
#ifndef _HELLO_JNI_IMPL_H
#define _HELLO_JNI_IMPL_H

#ifdef __cplusplus
		extern "C" {
#endif
		void sayHello();
#ifdef __cplusplus
	}
#endif

#endif


HelloJniImpl.cpp
using namespace std;

void sayHello () {
	cout << "Hello world from C++!" << endl;
	return;
}


4. Now create the dynamic lib of the cpp's code. I used Fish shell, firstly I set up these variables
set JNIH  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
set JDKH /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/lib/

Then run this two line

g++ -I"$JDKH" -I"$JNIH" -shared -o HelloJni.o HelloJni.cpp HelloJniImpl.cpp 
g++ -dynamiclib -o libhellojni.jnilib HelloJni.o

5. Run your java app
java HelloJni

the result of the program is would be like this:

Hello world from C++!


Enjoy!

Wednesday, October 22, 2014

Progress Skripsi: Metode Thresholding Sauvola

Di *UHUK* skripsi yang saya buat, saya perlu memproses gambar untuk dipisah menjadi foreground dan background. Dalam kasus saya yang perlu diproses adalah gambar dokumen form. Foregroundnya adalah tulisan dan backgroundnya adalah warna putih dari kertas. Metode ini disebut sebagai thresholding. Ternyata thresholdingnya sendiri banyak metode-metodenya loh! Salah satu metode yang bikin saya kagum namanya metode Sauvola.

Keabuan

Mari kita ngebahas keabuan dulu.

Umumnya gambar punya warna-warna yang banyak. Dalam image processing warna-warna ini biasanya dipisah dalam channel-channel yang berbeda. Contohnya yang paling sering saya pakai gambar dipisah jadi 3 channel yaitu RGB( Red, Green, dan Blue).

Di channel-channel ini terdapat nilai keabuan masing-masing. Nilai keabuan ini memiliki rentang dari 0-255. Representasinya bisa dibentuk jadi matriks yang punya masing-masing nilai keabuan di tiap elemen. Kalau pakai RGB jadinya satu piksel ada 3 nilai keabuan. Secara umum matriksnya bisa direpresentasikan berdimensi mxnxo.

Gambar dengan nilai RGB ini juga bisa dikonversi jadi gambar abu-abu saja (yang sering kita kenal sebagai grayscale) dengan aturan gini:

pixel_abu = pixel_r*0.299 + pixel_g*0.587 + pixel_b*0.114

Thresholding

Nah, kalau konversi grayscale mengubah dari gambar RGB jadi nilai keabuan saja, thresholding membuatnya lebih sederhana lagi. Metode thresholding membuat gambar dengan nilai keabuan menjadi gambar biner, yakni hitam dan putih saja.

Metode thresholding dibagi dua berdasarkan cakupan nilai thresholdnya. Global threshold dan local threshold. Kalau global threshold menggunakan nilai threshold untuk semua gambar, local threshold memiliki nilai threshold yang berbeda-beda di bagian-bagian gambarnya.

Nah, coba kita lihat perbedaannya masing-masing ya.

Metode Otsu

Salah satu metode global threshold yang umum dipakai adalah metode Otsu. Ide dasar dari thresholding ini adalah terdapat dua kelompok nilai keabuan. Nah, metode Otsu memberikan nilai threshold untuk memisahkan nilai tersebut.

Yang mau tahu lebih detilnya metode Otsu bisa lihat di wikipedia

Kelebihan dan Kekurangan Metode Otsu

Kalau cahayanya cukup merata, metode Otsu ini cukup baik loh untuk dipakai.


Sayangnya cahaya yang ada di citra tidak semulus paha Cherry Belle *halah*. Uh... maksudnya cahaya yang ada di kertas berbeda-beda intensitasnya. Misalnya kita punya gambar yang kayak gini

Kalau dilihat sekilas sih bagus-bagus aja ya, tapi itu intensitasnya berbeda-beda. Bagian kertas yang dekat dengan cahaya lebih terang dibandingkan dengan bawah. Nah, inilah kelemahan dari metode Otsu.
bagian yang dithreshold menjadi hitam seperti ini karena sebaran cahaya yang tidak merata

Metode... Uh... Galau...

Hal ini membuat saya galau berhari-hari. Saya bingung. Saya lelah. Saya hina. Aah. Aah.

Awalnya saya mencoba agar cahaya yang didapatkan merata. Caranya saya membuat instrumen sebuah kotak dilapisi kertas putih agar cahaya membias dan disinari dengan lampu emergency. Tapi ternyata bahkan dengan instrumen seperti ini mendapatkan gambar dengan cahaya yang merata tetap susah. Lampu yang saya gunakan tetap saja memberikan cahaya yang lebih terang di bagian depan. Kalau lampunya diletakkan di atas (misalnya digantung) nanti pas pakai kamera handphone cahayanya kehalangan handphone dong? Hmmm...

si kotak bercahaya
Dari kesimpulan saya, Otsu benar-benar memisahkan gambar menjadi dua kelas relatif berdasarkan gambar. Jadi walaupun gambarnya terlihat cukup terang bagian gambar yang lebih gelap akan dinyatakan sebagai background *hiks*. Nah lucunya kalau gambarnya tidak terlalu terang dan tidak terlalu gelap metode Otsu sukses untuk memisahkannya menjadi dua bagian.

Gambar yang cukup abu-abu ternyata bisa di threshold. Wah.
Akhirnya saya googling lagi dan ketemu dengan beragam keyword, antara lain threshold, local thresholding, dan adaptive thresholding.

Local Thresholding

Ternyata permasalahan dengan cahaya yang tidak merata adalah hal yang umum di thresholding. Banyak penelitian yang mengulas hal ini. Sub topik bidang ini dinamakan sebagai local thresholding. Kenapa local? Karena nilai threshold berbeda-beda di seluruh bagian gambar.
Ada teknik-teknik keren seperti Chow-Kaneko yang memotong-motong gambar dan diberikan thresholding dengan Otsu method pada masing-masing gambar, ada juga yang nyari rata-rata kebuan di sekeliling tiap-tiap pixel. Salah satu penelitian yang hasilnya menurut saya cukup bagus untuk digunakan di skripsi saya adalah metode Sauvola.

Metode Sauvola

Metode Sauvola sebenarnya pengembangan dari metode Niblack. Katanya Sauvola, metode Niblack itu dirumuskan gini:

T = m + k*s

dimana T itu nilai thresholdnya, m itu rata-rata keabuan, k konstanta, dan s itu standar deviasi.

Alamak, ternyata saya banyak ketemu statistika di image processing.

Eh, balik lagi. Jadi kata Sauvola nilai metode Niblack kurang memuaskan kalau gambar yang di threshold memiliki tekstur yang terang. Sauvola kemudian memodifikasi metode Niblack menjadi seperti ini:

T(x,y) = m(x,y) * (1+( k*( (s(x,y)/R)-1) ) );

dimana R adalah "dynamic range standard deviation". Di penelitiannya Sauvola nilai R itu paling bagus 128 dan k-nya 0.5;

Algoritma Sauvola

Heh, itu semua cuma rumus geje woy. Cara pakainya gimana?

Jadi algortima metode Sauvola tuh gini

  1. Untuk masing-masing piksel (Loop i dan j) telusuri sejauh n window, kita sebut piksel ini sebagai P_threshold. Hal ini dlakukan agar beban komputasi kecil. Besar n bebas. Semakin kecil n nya maka gambar yang memiliki keabuan merata akan dibuat menjadi background.
  2. Cari m dari sekeliling P_threshold.
  3. Cari s dari sekeliling P_threshold.
  4. Tentukan besar T dan simpan di matriks_threshold.
  5. end for (i dan j)!
  6. Untuk masing-masing piksel (Loop i dan j) telusuri lagi sejauh n window, kita sebut piksel ini sebagai P_abu.
  7. Untuk masing-masing piksel (Loop ii dan jj) dari i hingga n dan j hingga n (kita sebut piksel ini sebagai P_window).
  8. Cek apakah indeks i dan j tidak memiliki sisa bagi dengan n. Jika ada berarti merupakan piksel acuan. Tentukan keabuannya dari indeks di matriks_threshold. Tentukan nilai piksel berdasarkan T.
  9. Jika bukan merupakan piksel acuan kita cari rata-rata thresholdnya dengan rumus ini:
    T = (matriks_threshold[i][j]+ //titik kiri atas
    matriks_threshold[i][j+n]+ //titik kanan atas
    matriks_threshold[i+n][j]+ //titik kiri bawah
    matriks_threshold[i+n][j+n] //titik kanan bawah
    )/4;
    Tentukan nilai piksel berdasarkan T.


  10. end for (i dan j)!
  11. end for (ii dan jj)!
Udah deeeh. Itu algoritma umumnya. Kalau saya nambahin dikit algoritmanya untuk ngehandle kalau piksel P_abu ternyata mentok, kalau mentok berarti P_abu di sekelilingnya kurang dari 4.


Untuk penelitian saya menggunakan n = 30, R = 128, dan k = 0.3. Hasilnya cukup memuaskan loh

gambar yang sebelumnya jelek kalau di threshold dengan metode Otsu ternyata dengan metode Sauvola menghasilkan hasil yang bagus
Bahkan yang cukup ekstrim, yaitu gambar yang diambil menggunakan lampu blitz. Permasalahan di gambar ini adalah cahaya berada di tengah dan intensitasnya berubah menjadi gelap semakin ke arah luar.

Form yang diambil dengan lampu blitz

menggunakan metode Sauvola

menggunakan metode Otsu

Keep fighting! 


Yaay. Nah sekarang udahan buat image processingnya. Sekarang mari kita ulik lebih lanjut di Neural Networknya. Yuhu!

p.s: Kalau mau kasih semangat boleh loh komen-komen disini, huehue.

Thursday, October 9, 2014

Tempat Enak Buat Ngerjain Skripsi

Skripsi. Semakin lama kamu menjadi mahasiswa, semakin something rasanya kata ini. Iya lah. Alasannya karena semakin banyak yang bertanya "Kapan lulus?" *batuk darah*. Biar bisa jawab berarti skripsinya harus selesai. Biar selesai berarti harus dikerjain. Dimana aja tempat yang enak buat bikin skripsi?

Supaya tidak terlalu meluas maka kita tentukan dulu kriteria tempat yang enak buat skripsi. Menurut saya ada beberapa faktor utama yang menjadikan sebuah tempat menjadi tempat-skripsiable.

  1. Ada colokan listrik. Kecuali buku skripsi kamu dikerjakan dengan mesin ketik atau tulis tangan sih.
  2. Ada koneksi internet. Kamu perlu mencari jurnal-jurnal terkait penelitian kamu kan? Kalau nggak ada internet susah banget untuk cari referensi. Bagi yang kuliahnya berhubungan dengan ngoding apalagi, rasanya nggak bisa hidup kalau nggak ada StackOverflow.
  3. Ada tempat sholat. Biar kita selalu beribadah dan dimudahkan dalam mengerjakan skripsi. Eaa. Semakin gampang kamu ninggalin laptop buat sholat maka semakin bagus dan praktis tempatnya.
Rumah
Emang bener kata orang kalau "home sweet home," yang secara literal artinya rumah manis rumah. Kamu tinggal duduk manis dan ngerjain skripsi sesuka kamu. Bahkan nggak cuma duduk, kamu bebas mau tengkurep, rebahan, kayang, bebas! Namanya juga rumah kamu.
Tapi masalahanya kalau di rumah ada aja gangguan menggoda. Mulai dari televisi yang menggoda untuk ditontonin, orang tua yang minta dibeliin minyak di warung, sampai kasur yang mengajak untuk tidur bareng.

Skor
Colokan: 10/10
Internet: 3/10 sampai 10/10. Tergantung koneksi kamu pakai apa sih
Sholat: 10/10
Nilai plus:
  • Kalau lagi laper gampang
  • Kalau mau gogoleran di kasur dulu enak
  • Bisa main-main dulu, nonton tv, bahkan mandi. Eh, kapan nyekripnya?

Kosan
Yang jauh dari rumah biasanya ngekos. Ngekos sebenarnya mirip sama rumah, cuma bedanya semua dikerjakan sendiri. Kamu bisa fokus ngerjain skripsi. Tapi ya tergantung seberapa elit kosan kamu. Kalau kasurnya berbantalkan bulu angsa dan kamarnya dilengkapi home theater yahud tingkat distraction nya juga nggak ketulungan, hahaha. Kalau nggak ya temen kosan kadang suka gigitaran dan nyanyi-nyanyi, atau tiba-tiba ada yang ngajak jalan-jalan.

Skor
Colokan: 10/10
Internet: 3/10 sampai 10/10. Tergantung koneksi kosan kamu.
Sholat: 10/10
Nilai plus:
  • Kalau lagi bosen bisa gangguin tetangga
  • Bisa gogoleran juga

Perpustakaan
Canggih banget nih yang suka ke perpustakaan. Contoh mahasiswa teladan. Asal ke perpustakaannya bukan buat ngeceng ya.
Di perpustakaan kamu bisa menemukan beragam referensi. Tapi sayang karena tempat duduknya terbatas jadi kalau lagi apes ya nggak dapet deh. Selain tempat duduknya terbatas colokannya juga berebut! Ya jadi pasrah aja deh kalau baterai laptop kamu abis.

Skor
Colokan: 2/10
Internet: 8/10. Kadang suka kehabisan IP Address, tapi kecepatannya maknyos!
Sholat: 5/10. Kalau kamu sendirian susah buat ninggalin laptop
Nilai plus:
  • Dekat dengan kampus, jadi kalau mau bimbingan bisa langsung
  • Referensi yang bejibun
  • Bisa ketemu temen buat diskusi
Lab
Sebagai peneliti muda yang mengerjakan buku skripsi kerjanya pasti cocoknya di lab dong? Apalagi kalau kampus kamu punya lab yang memadai dan sesuai dengan penelitian kamu. Kamu bisa nyobain metodologi dengan beragam peralatan yang bagus. Sayangnya lab suka jadi tempat buat nongkrong asdos (asisten dosen) dan aslab (asisten lab) yang bikin nggak enak kalau nggak ada temen seangkatan. Hahaha.

Skor
Colokan: 8/10. Tergantung juga sih, labnya penuh atau nggak
Internet: 10/10.
Sholat: 8/10. Enaknya kalau di lab laptopnya bisa dititip sama aslab.
Nilai plus:
  • Mirip sama di perpus, deket dengan kampus dan bisa ketemu sama temen yang bisa diajak diskusi

Cafe
Woow, gaya banget nih yang ini. Kamu bisa ngerjain skripsi sambil ditemani segelas kopi bersauskan karamel dengan taburan coklat dan wafer. Asalkan ada duitnya.

Skor
Colokan: 5/10. Tergantung kafenya gimana, tapi ya biasanya jarang sih ada colokan.
Internet: 5/10. Tergantung kafenya lagi gimana. Ah, biasanya mah standar aja koneksinya.
Sholat: 2/10. Hm... makin rawan kalau laptop ditinggal dulu pas lagi di kafe.
Nilai plus:
  • Bisa ngurangin duit
Itu aja dulu deh ya. Selamat nyekrip!

Tuesday, October 7, 2014

Progress Skripsi: Homography

Kali ini pakai bahasa Indonesia aja ya, the scientific english is still too hard for me, haha *padahal males*.

Di postingan sebelumnya saya membahas sedikit tentang homography, kali ini saya coba elaborasi sedikit ya.

Homo-what?

Pemetaan antara vektor \(\overrightarrow{p}\)  menuju \(\overrightarrow{q}\) dapat dinyatakan dengan
\[\overrightarrow{q} = H \overrightarrow{p} \]
dimana \(H\) adalah matrix dengan dimensi 3x3. Pemetaan tersebut dinamakan homography.

Intinya adalah terdapat sebuah matrix berukuran 3x3 (homograph matrix) yang bisa memetakan dari satu titik awal ke titik akhir. Homography berguna bagi proses image rectification (rektifikasi gambar), yakni proses koreksi spasial pada citra.

Menurut pak David Kriegman di mata kuliah Computer Vision 1  penjelasan homography adalah sebagai berikut:

persamaan homography dapat dinyatakan sebagai
\[X_2 = HX_1\]

Jika dituliskan elemen per elemen, persamaan homography dapat kita tuliskan sebagai berikut
\[
\begin{bmatrix}
x_2 \\
y_2 \\
z_2 \\
\end{bmatrix}
=
\begin{bmatrix}
H_{11} & H_{12} & H_{13} \\
H_{21} & H_{22} & H_{23} \\
H_{31} & H_{32} & H_{33} \\
\end{bmatrix}
\begin{bmatrix}
x_1 \\
y_1 \\
z_1 \\
\end{bmatrix}
\]

Pada ruang dua dimensi tidak terdapat kordinat Z, maka nilai x dan y dapat dinyatakan sebagai \(x'_2 = x_2/z_2\) , \(y'_2 = y_2/z_2\), dan \(z = 1\). Dari justifikasi ini nilai \(x'_2\) dan \(z'_2\) dapat dinyatakan sebagai berikut

\[ x'_{2} = \frac{H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]

\[ y'_2 = \frac{H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]

atau dapat ditulis sebagai
\[ x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} \]
\[ y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} \]
dan dikelompokkan menjadi persamaan linear berikut

\[ H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} - x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = 0 \]
\[ H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} - y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_1) = 0 \]

Persamaan tersebut dapat dinyatakan kembali sebagai berikut
\[a^T_xh = 0\]
\[a^T_yh = 0\]
dimana
\[h = (H_{11},H_{22},H_{23},H_{31},H_{32},H_{33})^T\]
\[a_x = (x_{1},y_{1},1,0,0,0,-x'_{2}x_{1},-x'_{2}y_{1},-x'_{2})^T\]
\[a_x = (0,0,0,x_{1},y_{1},1,-y'_{2}x_{1},-y'_{2}y_{1},-y'_{2})^T\]

Dengan persamaan tersebut kita dapat menyatakan persamaan linear untuk permasalahan homography sebagai:
\[Ah = 0\]

dimana
\[A = \begin{pmatrix}
a^T_x1\\
a^T_y1\\
.\\
.\\
.\\
a^T_xn\\
a^T_yn
\end{pmatrix}
\]

matriks \[A\] ini dinamakan matriks estimasi.

Oke, kita bisa masukkin variabel-variabel tadi ke \(Ah = 0\). Terus bagaimana cara menentukan nilai H nya? Untuk menyelesaikannya kamu bisa menggunakan Singular Value Decomposition

Singular Value Decomposition

Sejauh yang saya tangkap dari pembahasan di MIT OCW dan tutorial SVD dari pak Kirk Baker, inti dari SVD adalah sebuah proses untuk memecah sebuah matriks menjadi 3 matriks. Rumusan umumnya adalah sebagai berikut

\[A_{mn} = U_{mm} S_{mn} V^T_{nn}\]

Tutorial yang sangat lengkap dan jelas mengenai SVD ada di tutorialnya pak Kirk Baker. Bagi rekan-rekan yang ingin belajar lebih lengkap tentang SVD silahkan mengunjungi tutorial tersebut.

\(S\) merupakan matriks diagonal. Nilai \(S_{mn}\) yang paling kecil akan berkorespondensi dengan salah satu kolom pada matriks \(V^T\). Kolom tersebut berisi nilai-nilai \(H\) yang kita inginkan sebagai matriks homograph.

Pada penjelasan oleh pak David Kriegman disebutkan pula bahwa nilai \(V\) memiliki hubungan dengan nilai eigenvector dari \(A^TA\). Penjelasannya saya masih belum begitu paham kenapa, tapi sejauh yang saya tangkap hal ini dibuktikan dengan pendekatan squared error. Penjelasan beliau bisa dibaca di halaman 2 dan  3.

Hubungan \(V\) dan nilai eigenvector dari \(A^TA\) tersebut memungkinkan penghitungan diringkas dengan mencari nilai eigenvalue terkecil dari eigenvector \(A^TA\) dan mengambil kolom dari \(V\) berdasarkan posisi nilai eigenvalue tersebut. Kode implementasinya bisa kamu lihat di project The-Imp berikut.

Yang saya kerjakan

Saya pun mengimplementasikan homography tersebut ke program ekstraksi huruf-huruf. Saya pun menemukan masalah.

Seperti diketahui, rumus yang kita ketahui adalah \(X_2 = HX_1\).  Jika kita menggunakan rumus ini berarti kita memetakan dari \(X_1\) ke \(X_2\), padahal pertanyaannya adalah

"saat di sebuah titik pada \(x_2\), dimanakah titik \(x_1\) yang dikalikan matriks \(H\)?"

Dari pertanyaan tersebut padahal nilai yang diketahui adalah \(H\) yang merupakan matriks homograph dan \(X_2\) yang merupakan setiap titik akhir yang diinginkan. Jika tetap dilakukan dengan rumus awal maka akan terjadi pembulatan yang akhirnya terbentuk bagian yang kosong.
garis-garis hitam karena pembulatan. Garis ini adalah bagian gambar yang tidak terpetakan.

Berarti apa yang harus kita lakukan? Yak! Invers!

\[X_2H^{-1} = X_1\]

Saya kemudian mengimplementasikan rumus ini ke program. Matriks estimasi yang saya inputkan adalah titik kontrol pada form. Dan hasilnya cukup memuaskan *fyuuuh*. Akhirnya euy, semingguan belajar tentang homography *jadi curhat*.

Oh iya, btw saya pakai library Apache Commons Math untuk proses matriks seperti transpose, invers, dan mencari nilai eigen. Kok gitu? Otak saya masih belum cukup professor, heheh.

Eksperimen


Oke deh. Sekarang kembali ke skripsi. Saya menginginkan untuk melakukan ekstraksi di form seperti ini.

Gambar di atas adalah contoh yang bagus untuk jenis form yang memiliki kasus kemiringan dan proyeksi.

Uji Coba 1

Di postingan sebelumnya saya sempat memberitahu saya menggunakan affine transformation berupa shearing agar titik-titik kontrol dapat sejajar. Hasilnya hanya dengan shearing adalah sebagai berikut
Rektifikasi hanya dengan shearing
Seperti dilihat angka 9,8,7, 6, dan 5 cukup terpotong

Uji Coba 2

Uji coba ini hanya menggunakan homography. Pada angka 9, 8, 7, 6, dan 5 lebih baik dan cukup terlihat.
Namun permasalahannya adalah metode homography tidak membuat titik-titik kontrol sejajar seperti yang saya harapkan. Artinya jika form terlalu miring maka tidak dapat dideteksi.
Rektifikasi hanya dengan homography

Uji Coba 3

Percobaan kali ini menggunakan homography dan shearing. Ternyata hasilnya lebih baik, bahkan sebagian besar border hilang. 
Rektifikasi dengan homography dan shearing
Dengan metode ini form yang cukup miring pun bisa ditangani. Saya belum menghitung kemiringan berapa derajat. Seingat saya metode hanya dengan homography tidak sanggup saat kemiringan mengakibatkan titik kontrol tidak melewati titik-titik penanda kolom/baris jika ditarik garis lurus.

[UPDATE 7-Oct-2014] Uji Coba 4

Saat implementasi Homography ternyata saya salah kordinat yang dikalikan. Saya salah memasukkan koordinat x dan y, keduanya terbalik! Ternyata hanya dengan homography hasilnya sangat bagus!
Woow! Align perfectly!

Saya mengetahui keanehan ini saat memperhatikan uji coba 3 terdapat karakter "d koreksi" terpotong (di bawah angka 7 pada gambar yang sudah diekstraksi). Karena khawatir maka saya bereksperimen dengan melakukan pemindaian menggunakan form yang penuh dengan grid.
form yang sengaja saya beri transformasi proyektif agar bisa dilihat hasil rektifikasi nya

Berikut percobaan dengan hanya homography. Di ujung gambarnya keluar dari grid yang diinginkan
percobaan cek semua grid dengan homography
Berikut percobaan dengan shear kemudian homography. Ternyata salah juga!
percobaan cek semua grid dengan shear kemudian homography
Kemudian saya melakukan debugging dan menguji kembali percobaan untuk mengecek semua grid. Hasil dengan hanya menggunakan homography ternyata sangat memuaskan!!
Aku terpuaskan!!!
Jadi kesimpulannya homography dan rektifikasi adalah sahabat terbaik. Ciye ciye.


Skripsinya

Ini kok eksperimen mulu sih? Skripsinya kapan dikerjain woy!
Ya atuhlah... pan skripsi teh eksperimen, kumaha ih.

Jadi kemarin saya bimbingan dengan dosen pembimbing saya. Karena saya khawatir dengan program saya yang belum punya arahan yang pasti maka saya menunjukkan mockup tampilan program yang akan dibuat. Ternyata lumayan dapat banyak pencerahan, salah satunya adalah
"Kerjakan diagram dulu baru ngoding"

*uhuk*

Ini penyakit yang sudah terlalu dibiasakan. Ngoding dulu akhirnya acakadut. Berarti sekarang saya mengerjakan doktek (dokumen teknis) dulu sembari revisi bab 1.

Terus?

That's it! Mari kita lanjut ngerjain skripsi lagi. Ulalala. Ulalala. Ulala.

Saturday, October 4, 2014

Pilihan judul skripsi


Siapa tahu ada yang lagi nyari judul skripsi
  1. Implementasi pengenalan bentuk tangan pada aplikasi penyensoran otomatis isyarat tangan pada citra foto
    Jadi kalau ada yang pake isyarat f*ck gitu di foto bisa otomatis ditutupin
  2. Rektifikasi gambar otomatis berdasarkan kesejajaran huruf pada teks
    Teks yang difotonya miring-miring bisa jadi lurus. Untuk referensi banyak nih penelitian serupa tentang ini, berhubungan tentang homography gitu.
  3. Penerapan local thresholding pada citra dokumen untuk mengatasi gangguan bayangan.  - jadi saya punya problem kalau di gambar planar (misalnya foto dokumen) dan thresholding yang dilakukan hanya menggunakan global threshold maka bayangan akan dibuat menjadi warna hitam. Dengan local thresholding masalah ini bisa diatasi.
  4. Pencarian pola yang telah diterapkan pada citra. Inti dari penelitian ini adalah mencari tanda khusus pada gambar, misalnya tanda khusus untuk Augmented Reality, atau mencari QR Code pada gambar yang crowded. Saya belum tahu metode khususnya apa, kalau ketemu bisa jadi topik yang lebih khusus lagi.
Kalau ketemu lagi nanti di update. Kalau ada yang menggunakan topik di atas dalam penelitiannya komen disini ya. Saya tertarik untuk mengetahui hasil penelitiannya :)