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
C:\ece595_06\class20>java Convolve4 test3.png 2
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