/*Diana Negoescu '09 * program 'reads' a road sign by counting the similar pixels between letters * execution: java Img picture_name.jpgav+20) result.set(j,i,white); else result.set(j,i,black); } } result.show(); return result; } //label each pixel according to which object it belongs 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.BLACK)) 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 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; } static int partition(Letter[] a, int[] mmin, 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, i, j); // swap left and right } exch(a, mmin, i, right); // swap pivot return i; } public static void quicksortgen(Letter[] a, int b, int i, int[] mmin) { quicksort(a, mmin, b, i); } private static void quicksort(Letter[] a,int[] mmin, int left,int right){ if (right <= left) return; int i = partition(a, mmin, left, right); quicksort(a, mmin, left, i-1); quicksort(a, mmin, i+1, right); } //function that extracts the letters from a 'flood' matrix public static Letter[] extract(int[][] a, int h, int w, int k){ //create an array of letters Letter[] letters=new Letter[k-1]; int[] mmin=new int[k-1]; int[] jmin=new int[k-1]; int[] jmax=new int[k-1]; for (int i=1; ijmax[i-1])) jmax[i-1]=j; if ((a[j][m]==i)&&(mmmax)) 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; j=0)&&(ii=0)&&(jj