user3078335 - 9 months ago 171

Java Question

There is this image comparison code I am supposed to modify to highlight/point out the difference between two images. Is there a way to modify this code so as to highlight the differences in images. If not any suggestion on how to go about it would be greatly appreciated.

`int width1 = img1.getWidth(null);`

int width2 = img2.getWidth(null);

int height1 = img1.getHeight(null);

int height2 = img2.getHeight(null);

if ((width1 != width2) || (height1 != height2)) {

System.err.println("Error: Images dimensions mismatch");

System.exit(1);

}

long diff = 0;

for (int i = 0; i < height1; i++) {

for (int j = 0; j < width1; j++) {

int rgb1 = img1.getRGB(j, i);

int rgb2 = img2.getRGB(j, i);

int r1 = (rgb1 >> 16) & 0xff;

int g1 = (rgb1 >> 8) & 0xff;

int b1 = (rgb1) & 0xff;

int r2 = (rgb2 >> 16) & 0xff;

int g2 = (rgb2 >> 8) & 0xff;

int b2 = (rgb2) & 0xff;

diff += Math.abs(r1 - r2);

diff += Math.abs(g1 - g2);

diff += Math.abs(b1 - b2);

}

}

double n = width1 * height1 * 3;

double p = diff / n / 255.0;

return (p * 100.0);

Answer

What I would do is set each pixel to be the difference between one pixel in one image and the corresponding pixel in the other image. The difference that is being calculated in your original code is based on the L_{1} norm. This is also called the sum of absolute differences too. In any case, write a method that would take in your two images, and return an image of the same size that sets each location to be the difference for each pair of pixels that share the same location in the final image. Basically, this will give you an indication as to which pixels are different. The whiter the pixel, the more difference there is between these two corresponding locations.

I'm also going to assume you're using a `BufferedImage`

class, as `getRGB()`

methods are used and you are bit-shifting to access individual channels. In other words, make a method that looks like this:

```
public static BufferedImage getDifferenceImage(BufferedImage img1, BufferedImage img2) {
int width1 = img1.getWidth(); // Change - getWidth() and getHeight() for BufferedImage
int width2 = img2.getWidth(); // take no arguments
int height1 = img1.getHeight();
int height2 = img2.getHeight();
if ((width1 != width2) || (height1 != height2)) {
System.err.println("Error: Images dimensions mismatch");
System.exit(1);
}
// NEW - Create output Buffered image of type RGB
BufferedImage outImg = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB);
// Modified - Changed to int as pixels are ints
int diff;
int result; // Stores output pixel
for (int i = 0; i < height1; i++) {
for (int j = 0; j < width1; j++) {
int rgb1 = img1.getRGB(j, i);
int rgb2 = img2.getRGB(j, i);
int r1 = (rgb1 >> 16) & 0xff;
int g1 = (rgb1 >> 8) & 0xff;
int b1 = (rgb1) & 0xff;
int r2 = (rgb2 >> 16) & 0xff;
int g2 = (rgb2 >> 8) & 0xff;
int b2 = (rgb2) & 0xff;
diff = Math.abs(r1 - r2); // Change
diff += Math.abs(g1 - g2);
diff += Math.abs(b1 - b2);
diff /= 3; // Change - Ensure result is between 0 - 255
// Make the difference image gray scale
// The RGB components are all the same
result = (diff << 16) | (diff << 8) | diff;
outImg.setRGB(j, i, result); // Set result
}
}
// Now return
return outImg;
}
```

To call this method, simply do:

```
outImg = getDifferenceImage(img1, img2);
```

This is assuming that you are calling this within a method of your class. Have fun and good luck!