Convolve.javaimport 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