Convolve1

C:\ece595_06\class16>java Convolve

test3.png

  0  23  46  69  93 116 139 162 186 209 232
  0  23  46  69  93 116 139 162 186 209 232
  0  23  49 155 225 229 191 165 186 209 232
  0  23 145 232 232 232 232 201 186 209 232
  0  23 223 232 232 232 232 230 186 209 232
  0  23 223 232 232 232 232 230 186 209 232
  0  23 145 232 232 232 232 201 186 209 232
  0  23  49 155 225 229 191 165 186 209 232
  0  23  46  69  93 116 139 162 186 209 232
  0  23  46  69  93 116 139 162 186 209 232
  0  23  46  69  93 116 139 162 186 209 232

convolution mask

  0   0   0   0   0
  0   0   0   1   0
  0   0   0   0   0
  0   0   0   0   0
  0   0   0   0   0

filtered image

 23  46  69  93 116 139 162 186 209 232 232
 23  46  69  93 116 139 162 186 209 232 232
 23  46  69  93 116 139 162 186 209 232 232
 23  49 155 225 229 191 165 186 209 232 232
 23 145 232 232 232 232 201 186 209 232 232
 23 223 232 232 232 232 230 186 209 232 232
 23 223 232 232 232 232 230 186 209 232 232
 23 145 232 232 232 232 201 186 209 232 232
 23  49 155 225 229 191 165 186 209 232 232
 23  46  69  93 116 139 162 186 209 232 232
 23  46  69  93 116 139 162 186 209 232 232


Convolve.java

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


public class Convolve {
int mask[][];
int scl;
boolean scale, bipolar;
boolean bipolar2 = false;
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 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];
   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 - midr;
		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 (bipolar) sum = (sum+256)/2;
	
           r = g = b = sum;

	   if (bipolar2) {
		v = sum;
	        //g = data[midr][i];
                g = 0;
                if (v>0) {
                    r=v; b=0;
	        }
                else { r=0; b=-v; };
           }
           val[i] = 0xFF000000 | (r << 16) | (g << 8) | b;
      } 
      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;
}
    public static void main(String [] args) {

	String filename = "test3.png";
	if (args.length>0) filename = args[0];

	showImage f1 = new showImage(filename);
	f1.setLocation(10,10);
	f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	int w = f1.getWidth();
	int h = f1.getHeight();
	listImage.listGray(f1.img,filename);
	//int mask[][] = { {-1, 0, 1},{-2, 0, 2},{-1, 0, 1} };
	//int mask[][] = { {0, 0, 1}, {0, 0, 0}, {0, 0, 0} };;
	int mask[][] = new int[5][5];
	mask[1][3] = 1;
	Convolve c = new Convolve(mask);
	c.showMatrix(mask,"convolution mask");
	BufferedImage outp = c.doConvolve(f1.img);
	showImage f2 = new showImage(outp,"gray version");
	f2.setLocation(20+w,10);
	f2.writeImage("out1","png");
	listImage.listGray(f2.img,"filtered image");
		
    }
}


Maintained by John Loomis, updated Mon Oct 14 22:20:08 2013