bwOps.java


bwOps.java

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


public class bwOps {
int mask[][];
int mr, mc;
BufferedImage img;
int h1, w1;

public bwOps(int mask[][])
{
   this.mask = mask;
   mr = mask.length;
   mc = mask[0].length;
}


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 void showMatrix(int v[][], String cmt)
{
   int i, j;
   int nrow = v.length;
   int ncol = v[0].length;
   System.out.format("%n%s%n%n",cmt);
   for (j=0; j<nrow; j++) {
      for (i=0; i<ncol; i++) {
               System.out.format("%3d ",v[j][i]);
      }
      System.out.format("%n");
   }
}

public BufferedImage doDilate(BufferedImage in)
{
   int i, j, i1, j1, sum, v, midr, midc;
   int r, g, b, c;
   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 data[][] = new int[mr][w1];
   int val[] = new int[w1];
   int vt[] = 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;
   for (j=0; j<h1; j++) {
      for (i=0; i<w1; i++) {
	   sum = 0;
           for (j1=0; j1<mr; j1++) {
              for (i1=0; i1<mc; i1++) {
                c = i + i1 - midc;
		try { v = data[j1][c]; }
		catch(ArrayIndexOutOfBoundsException e) {
		  if (c<0) v = data[j1][0];
		  else v = data[j1][maxc];
		}
		if (mask[j1][i1]>0 && v>128) {
			sum=1;
			break;
		}
		if (sum==1) break;
              }
           }	   
           val[i] = sum>0? 0xFFFFFFFF: 0xFF000000;
      }
      outp.setRGB(0, j, w1, 1, val, 0, w1);
      int [] swp;
      swp = data[0];
      for (int m=1; m<mr; m++) data[m-1] = data[m];
      if (row<h1) {
		getLine(row++,swp);
		data[mr-1] = swp;
      }
   }
   return outp;
   }

public BufferedImage doErode(BufferedImage in)
{
   int i, j, i1, j1, sum, v, midr, midc;
   int r, g, b, c;
   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 data[][] = new int[mr][w1];
   int val[] = new int[w1];
   int vt[] = 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;
   boolean ok;   
   for (j=0; j<h1; j++) {
      for (i=0; i<w1; i++) {
	   ok = true;
           for (j1=0; j1<mr; j1++) {
              for (i1=0; i1<mc; i1++) {
                c = i + i1 - midc;
		try { v = data[j1][c]; }
		catch(ArrayIndexOutOfBoundsException e) { 
		  if (c<0) v = data[j1][0];
		  else v = data[j1][maxc];
		}
		if (mask[j1][i1]>0 && v<128) {
			ok=false;
			break;
		}
              }
	      if (!ok) break;
           }	   
           val[i] = ok? 0xFFFFFFFF: 0xFF000000;
      }
      outp.setRGB(0, j, w1, 1, val, 0, w1);
      int [] swp;
      swp = data[0];
      for (int m=1; m<mr; m++) data[m-1] = data[m];
      if (row<h1) {
		getLine(row++,swp);
		data[mr-1] = swp;
      }
   }
   return outp;
   }


}


Maintained by John Loomis, updated Sun Mar 11 11:09:35 2018