example 1

   

   

C:\ece595_06\class20>java Convolve4

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

 -1  -2  -1
  0   0   0
  1   2   1

version1

128 128 128 128 128 128 128 128 128 128 128
128 128 133 147 156 153 141 131 128 128 128
128 134 150 163 162 157 149 138 130 128 128
128 138 154 148 133 131 137 138 132 128 128
128 132 137 132 128 128 129 131 129 128 128
128 123 118 123 128 128 126 124 126 128 128
128 117 101 107 122 125 119 117 124 128 128
128 122 105  93  93  99 107 117 126 128 128
128 128 122 109  99 102 114 124 128 128 128
128 128 128 128 128 128 128 128 128 128 128
128 128 128 128 128 128 128 128 128 128 128

version2

128 128 128 128 128 128 128 128 128 128 128
128 128 133 147 156 153 141 131 128 128 128
128 134 150 163 162 157 149 138 130 128 128
128 138 154 148 133 131 137 138 132 128 128
128 132 137 132 128 128 129 131 129 128 128
128 123 118 123 128 128 126 124 126 128 128
128 117 101 107 122 125 119 117 124 128 128
128 122 105  93  93  99 107 117 126 128 128
128 128 122 109  99 102 114 124 128 128 128
128 128 128 128 128 128 128 128 128 128 128
128 128 128 128 128 128 128 128 128 128 128


difference

  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0
max absolute difference: 0

example 2

C:\ece595_06\class20>java Convolve4 test3.png 2

   

example 3

C:\ece595_06\class20>java Convolve4  binary_blobs.jpg

convolution mask

 -1  -2  -1
  0   0   0
  1   2   1
max absolute difference: 0

original image

vertical edge (bipolar)

edge magnitude

Ideally the edge magnitude should be isotropic, that is, independent of edge orientation.


Convolve4.java

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


public class Convolve4 {
static final int wm = 21;
public static void getLine( BufferedImage img, int row, int dst[])
{
   int  v, r, g, b;
   int w1 = img.getWidth();
   //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 static int maxdiff(BufferedImage a, BufferedImage b) {
	int maxdiff = 0;
	int w = a.getWidth();
	int h = a.getHeight();	
	if (b.getWidth() != w || b.getHeight()!=h) {
	   System.out.println("Images not same size");
	   return -1;
	}
	int i, j, diff;
	int [] va = new int[w];
	int [] vb = new int[w];
	if (w<wm) System.out.format("%n%ndifference %n%n");
	for (j=0; j<h; j++) {
	   getLine(a,j,va);
	   getLine(b,j,vb);
	   for (i=0; i<w; i++) {
	      diff = va[i]-vb[i];
	      if (w<wm) System.out.format("%3d ",diff);
	      if (diff<0) diff = -diff;
	      if (diff>maxdiff) maxdiff = diff;
	   }
	   if (w<wm) System.out.format("%n");
	}
	System.out.format("max absolute difference: %d%n",maxdiff);
	return maxdiff;
    }
    public static void main(String [] args) {
	int display_mode = 1; // grayscale bipolar
	String filename = "test3.png";
	if (args.length>0) filename = args[0];
	if (args.length>1) display_mode = Integer.decode(args[1]);

	showImage f1 = new showImage(filename);
	f1.setLocation(10,10);
	f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	int w = f1.getWidth();
	int h = f1.getHeight();
        int wid = f1.img.getWidth();
	if (wid<wm) listImage.listGray(f1.img,filename);

        // use doConvolve (version1)

	//int mask[][] = { {-1, 0, 1},{-2, 0, 2},{-1, 0, 1} };
	int mask[][] = { {-1, -2, -1},{ 0, 0, 0},{ 1, 2, 1} };
	Convolve c = new Convolve(mask);
	c.setScale(8);
	c.setDisplayMode(display_mode);
	c.showMatrix(mask,"convolution mask");
	BufferedImage out1 = c.doConvolve(f1.img);
	showImage f2 = new showImage(out1,"version1");
	f2.setLocation(20+w,10);
	if (wid<wm) listImage.listGray(f2.img,"version1");

        // use doEdgeMag  (version2)

	c.edge_mode = 2; // show edge_y (grayscale display)
	BufferedImage out2 = c.doEdgeMag(f1.img);
	showImage f3 = new showImage(out2,"version2");
	f3.setLocation(10,20+h);
	if (wid<wm) listImage.listGray(out2,"version2");
	if (display_mode==1) maxdiff(f2.img,f3.img);

	c.edge_mode = 0; // show edge magnitude
	BufferedImage out3 = c.doEdgeMag(f1.img);
	showImage f4 = new showImage(out3,"edge magnitude");
	f4.setLocation(20+w,20+h);
		
    }
}


Maintained by John Loomis, updated Wed Oct 30 19:08:41 2013