EdgeMag.java

EdgeMag uses SquareRoot.java


EdgeMag.java

import java.awt.image.*;
import java.awt.color.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.JFrame;


public class EdgeMag {
BufferedImage img;
double scl;
boolean scale;
int display_mode = 0;
int edge_mode;
int h1, w1;
int maxval;

public EdgeMag()
{
   scale = false;
   scl = 0;
}

public void setScale(double scl)
{
   this.scl = scl/8;
   scale = true;
}



public void getLine( int row, int dst[])
{
   int  v, r, g, b;
   //System.out.format("row %d%n",row);
   img.getRGB(0, row, w1, 1, dst, 0, w1);
   for (int i = 0; i < w1; i++) {
     v = dst[i];
     r = (v >> 16) & 0xFF;
     g = (v >> 8) & 0xFF;
     b = v & 0xFF;
     v = (r + g + b) / 3; // gray by averaging the pixels
     dst[i] = v;
   }
}

public BufferedImage doEdgeMag(BufferedImage in)
{
   int i, j, i1, j1, sumx, sumy, sum,  midr, midc;
   int r, g, b, c;
   maxval = 0;
   img = in;
   w1 = img.getWidth();
   h1 = img.getHeight();	
   int maxr = h1 - 1;
   int maxc = w1 - 1;

   int type = BufferedImage.TYPE_INT_RGB;
   BufferedImage outp = new BufferedImage(w1, h1, type);

   int mr, mc;
   mr = mc = 3;
   int data[][] = new int[mr][w1];
   int val[] = new int[w1];
   midr = mr/2;
   midc = mc/2;
   for (j=midr; j<mr; j++) getLine(j-midr,data[j]);
   for (j=0; j<midr; j++) System.arraycopy(data[midr],0,data[j],0,data[j].length);
   int row = mr - midr;
   int p00,p01,p02,p10,p11,p12,p20,p21,p22;
   for (j=0; j<h1; j++) {
      p00 = p01 = data[0][0]; p02 = data[0][1];
      p10 = p11 = data[1][0]; p12 = data[1][1];
      p20 = p21 = data[2][0]; p22 = data[2][1];
      c = 1;
      for (i=0; i<w1; i++) {
	   sumx = (p02-p00 +((p12-p10)<<1) + p22-p20);
           sumy = (p20-p00 +((p21-p01)<<1) + p22-p02);
	   sum = SquareRoot.sqrt(sumx*sumx+sumy*sumy);
	   if (scale) sum = (int) (sum*scl);
	   else sum /= 8;
	   if (sum>maxval) maxval = sum;
	   if (sum>255) sum = 255;

/* for testing purposes
           if (edge_mode==0) sum = SquareRoot.sqrt(sumx*sumx+sumy*sumy); 
           else if (edge_mode==1) sum = (sumx+256)>>1;
           else sum = (sumy+256)>>1;
*/
           r = g = b = sum;
           val[i] = 0xFF000000 | (r << 16) | (g << 8) | b;
           p00 = p01; p01 = p02;
           p10 = p11; p11 = p12;
	   p20 = p21; p21 = p22;
	   c++;
	   try {
		p02 = data[0][c];
                p12 = data[1][c];
                p22 = data[2][c];
           }
	   catch(ArrayIndexOutOfBoundsException e) {
           }
		
      } 
      outp.setRGB(0, j, w1, 1, val, 0, w1);
      int [] swp;
      swp = data[0];
      for (j1=1; j1<mr; j1++) data[j1-1] = data[j1];

      if (row<h1) {
         data[mr-1] = swp;
         getLine(row++,data[mr-1]);
      }

   }
   return outp;
 }

}


Maintained by John Loomis, updated Sat Mar 16 12:46:16 2019