Convolve.java
import java.awt.image.*; import java.awt.color.*; import java.io.*; import javax.imageio.*; public class Convolve { int mask[][]; int scl; int bipolar_style=0; boolean scale, bipolar; int mr, mc; BufferedImage img; int h1, w1; public Convolve(int mask[][]) { this.mask = mask; mr = mask.length; mc = mask[0].length; scale = false; bipolar = false; scl = 0; } public void setScale(int scl) { this.scl = scl; scale = true; } public void setBipolar(boolean bipolar) { this.bipolar = bipolar; } public void setBipolarStyle(int set) { bipolar_style = set; bipolar = 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 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 doConvolve(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); //System.out.println("start main loop ..."); 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]; } sum = sum + mask[j1][i1]*v; } } if (scale) sum /= scl; if (sum>255) sum = 255; if (sum<-255) sum = -255; r = g = b = sum; vt[i] = sum; val[i] = 0xFF000000 | (r << 16) | (g << 8) | b; } if (bipolar) makeBipolar(vt,val); 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 void makeBipolar(int [] vin, int [] vout) { int r, g, b, v, sum; for (int i=0; i<vin.length; i++) { sum = vin[i]; switch (bipolar_style) { case 0: sum = (sum+255)/2; r = g = b = sum; break; case 1: v = sum; if (sum<0) v = -sum; r = g = b = 255; if (v>64) { if (sum>0) { r=255; b=g=255-v; } else if (sum<0) { r=g=255-v; b=255;; } } break; case 2: v = sum; if (sum<0) v = -sum; //g = data[midr][i]; r = g = b = 255; if (v>64) { if (sum>0) { r=v; b=g=0; } else if (sum<0){ r=g=0; b=v;; } } break; default: sum = (sum+255)/2; r = g = b = sum; } vout[i] = 0xFF000000 | (r << 16) | (g << 8) | b; } } }
Maintained by John Loomis, updated Sat Mar 10 16:48:53 2018