/*Diana Negoescu '09 * program 'reads' handwriting (or at leats tries...) disregarding the dots on the i's * execution java Marcovcalphai training_text.txt picture_name.jpg c alpha * c does not matter, and alpha should be around 9 or 10 */ import java.awt.Color; public class Markovcalphai{ //function that computes the luminance of a pixel public static double lum(Color color){ int r=color.getRed(); int g=color.getGreen(); int b=color.getBlue(); return .299*r+.587*g+.114*b; } //function that transforms a picture into a black and white one of same //dimension public static Picture blackwhite(String filename){ Picture source=new Picture(filename); int w=source.width(); int h=source.height(); Picture result=new Picture(w,h); Color black=new Color(0,0,0); Color white=new Color(255, 255, 255); double max=0.0; double min=255.0; double av=0; for (int i=0; i240) result.set(j,i,white); else result.set(j,i,black); } } return result; } public static void floodfillstack(Picture pic, int[][] a, Stack s, Color c, int k){ while (!s.isEmpty()){ Stack.Node x=s.pop(); if ((x.i>=pic.height())||(x.j>=pic.width())||(x.i<0)||(x.j<0)){ continue; } Color col=pic.get(x.j,x.i); if (col.equals(Color.WHITE)) continue; if (a[x.i][x.j]!=0) continue; s.push(x.i+1,x.j); s.push(x.i,x.j-1); s.push(x.i-1,x.j); s.push(x.i,x.j+1); a[x.i][x.j]=k; } } static boolean less(double x, double y) { return (x < y); } static void exch(Letter[] a,int[] mmin, int[] mmax, int[] jmin, int[] jmax, int i, int j) { Letter swapl = a[i]; a[i] = a[j]; a[j] = swapl; int swap=mmin[i]; mmin[i]=mmin[j]; mmin[j]=swap; swap=mmax[i]; mmax[i]=mmax[j]; mmax[j]=swap; swap=jmin[i]; jmin[i]=jmin[j]; jmin[j]=swap; swap=jmax[i]; jmax[i]=jmax[j]; jmax[j]=swap; } static void exch1(int[] a, int i, int j) { int swap = a[i]; a[i] = a[j]; a[j] = swap; } static void insertionSort(int[] a) { int N = a.length; for (int i = 0; i < N; i++) for (int j = i; j > 0; j--) if (less(a[j], a[j-1])) exch1(a, j, j-1); else break; } static int partition(Letter[] a, int[] mmin,int[] mmax,int[] jmin,int[] jmax, int left, int right) { int i = left - 1; int j = right; while(true) { while (less(mmin[++i], mmin[right])) // left pointer if (i == right) break; while (less(mmin[right], mmin[--j])) // right pointer if (j == left) break; if (i >= j) break; // pointers cross? exch(a, mmin, mmax, jmin, jmax,i, j); // swap left and right } exch(a, mmin, mmax, jmin, jmax, i, right); // swap pivot return i; } public static void quicksortgen(Letter[] a, int b, int i, int[] mmin, int[] mmax,int[] jmin,int[] jmax) { quicksort(a, mmin,mmax, jmin, jmax, b, i); } private static void quicksort(Letter[] a,int[] mmin,int[] mmax,int[] jmin,int[] jmax, int left,int right){ if (right <= left) return; int i = partition(a, mmin, mmax, jmin, jmax,left, right); quicksort(a, mmin, mmax, jmin, jmax,left, i-1); quicksort(a, mmin, mmax, jmin, jmax, i+1, right); } static Letter[] insertblank(Letter[] letters, int k){ int[][] blank=new int[40][50]; Letter blanklet=new Letter(blank, ' '); Letter[] letmod=new Letter[letters.length]; for (int i=0; i<=k; i++){ letmod[i]=letters[i]; } letmod[k+1]=blanklet; for (int i=k+2; ijmax[i-1])) jmax[i-1]=j; if ((a[j][m]==i)&&(m>mmaxp[i-1])) mmaxp[i-1]=m; if ((a[j][m]==i)&&(m10)&&(mmaxp[i-1]-mminp[i-1]>2)) p++; } //compute the median height of a letter int[] hig=new int[p]; p=0; for (int i=0; i10)&&(mmaxp[i]-mminp[i]>2)) { hig[p]=jmax[i]-jmin[i]; p++; } } insertionSort(hig); int median=hig[(int)(p/ 2)]; //find the areas of the letters int[] area=new int[k-1]; for (int j=0; j4*median)||(mmaxp[i]-mminp[i]<=2)||area[i]=threshhold)&&(jmax[i-1]-jmin[i-1]<=4*median)&&(mmaxp[i-1]-mminp[i-1]>2)&&(area[i-1]>=threshi)){ //find out the maximum and minimum coordinates of each letter mmin[i-1]=w; int mmax=0; for (int j=0; jmmax)) mmax=m; } } //create a smaller matrix just fitting the letter int[][] x=new int[jmax[i-1]-jmin[i-1]+1][mmax-mmin[i-1]+1]; //put 1's where the letter's pixels were for (int j=0; jw1+w2+gap) min=w1+w2+gap; } spwidth[i]=min; } int[] spordered=new int[spwidth.length]; for (int i=0; ithresh){ int[][] blank=new int[40][50]; Letter blanklet=new Letter(blank,' '); Node n=new Node(blanklet); q.insert(j, n); j++; } j++; } //count how many nodes there are in the queue k=1; Node x=q.first; while (x.next!=null){ x=x.next; k++; } x=q.first; Letter[] letmod=new Letter[k]; for (int i=0; i=0)&&(ii=0)&&(jj=0)&&(n>=0)) mark[m][n]++; if ((m>=0)&&(q>=0)) mark[m][q]++; if ((p>=0)&&(q>=0)) mark[p][q]++; if ((p>=0)&&(n>=0)) mark[p][n]++; if ((p>=0)&&(n>=0)) mark[m1][n]++; if ((p>=0)&&(n>=0)) mark[m1][q]++; if ((p>=0)&&(n>=0)) mark[m][n1]++; if ((p>=0)&&(n>=0)) mark[m][q1]++; if ((p>=0)&&(n>=0)) mark[p1][q]++; if ((p>=0)&&(n>=0)) mark[p1][n]++; if ((p>=0)&&(n>=0)) mark[p][q1]++; if ((p>=0)&&(n>=0)) mark[m1][n1]++; if ((p>=0)&&(n>=0)) mark[m1][q1]++; if ((p>=0)&&(n>=0)) mark[p1][q1]++; if ((p>=0)&&(n>=0)) mark[p][n1]++; if ((p>=0)&&(n>=0)) mark[p1][n1]++; } for (int i=0; i