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