Está realizado en Netbeans en un proyecto en consola para ello se debe crear un nuevo proyecto Java Aplication, para mi caso el nombre es ComparacionImagen.
A continuación crear una nueva clase, dar clic sobre el paquete y luego crear la Clase ImageCompare.
package comparacionimagen;
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
public class ImageCompare {
protected BufferedImage img1 = null;
protected BufferedImage img2 = null;
protected BufferedImage imgc = null;
protected int comparex = 0;
protected int comparey = 0;
protected int factorA = 0;
protected int factorD = 10;
protected boolean match = false;
protected int debugMode = 0; // 1: textual indication of change, 2: difference of factors
// constructor 1. use filenames
public ImageCompare(String file1, String file2) {
this(loadJPG(file1), loadJPG(file2));
}
// constructor 2. use awt images.
public ImageCompare(Image img1, Image img2) {
this(imageToBufferedImage(img1), imageToBufferedImage(img2));
}
// constructor 3. use buffered images. all roads lead to the same place. this place.
public ImageCompare(BufferedImage img1, BufferedImage img2) {
this.img1 = img1;
this.img2 = img2;
autoSetParameters();
}
// like this to perhaps be upgraded to something more heuristic in the future.
protected void autoSetParameters() {
comparex = 10;
comparey = 10;
factorA = 10;
factorD = 10;
}
// set the parameters for use during change detection.
public void setParameters(int x, int y, int factorA, int factorD) {
this.comparex = x;
this.comparey = y;
this.factorA = factorA;
this.factorD = factorD;
}
// want to see some stuff in the console as the comparison is happening?
public void setDebugMode(int m) {
this.debugMode = m;
}
// compare the two images in this object.
public void compare() {
// setup change display image
imgc = imageToBufferedImage(img2);
Graphics2D gc = imgc.createGraphics();
gc.setColor(Color.RED);
// convert to gray images.
img1 = imageToBufferedImage(GrayFilter.createDisabledImage(img1));
img2 = imageToBufferedImage(GrayFilter.createDisabledImage(img2));
// how big are each section
int blocksx = (int)(img1.getWidth() / comparex);
int blocksy = (int)(img1.getHeight() / comparey);
// set to a match by default, if a change is found then flag non-match
this.match = true;
// loop through whole image and compare individual blocks of images
for (int y = 0; y < comparey; y++) {
if (debugMode > 0) System.out.print("|");
for (int x = 0; x < comparex; x++) {
int b1 = getAverageBrightness(img1.getSubimage(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1));
int b2 = getAverageBrightness(img2.getSubimage(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1));
int diff = Math.abs(b1 - b2);
if (diff > factorA) { // the difference in a certain region has passed the threshold value of factorA
// draw an indicator on the change image to show where change was detected.
gc.drawRect(x*blocksx, y*blocksy, blocksx - 1, blocksy - 1);
this.match = false;
}
if (debugMode == 1) System.out.print((diff > factorA ? "X" : " "));
if (debugMode == 2) System.out.print(diff + (x < comparex - 1 ? "," : ""));
}
if (debugMode > 0) System.out.println("|");
}
}
// return the image that indicates the regions where changes where detected.
public BufferedImage getChangeIndicator() {
return imgc;
}
// returns a value specifying some kind of average brightness in the image.
protected int getAverageBrightness(BufferedImage img) {
Raster r = img.getData();
int total = 0;
for (int y = 0; y < r.getHeight(); y++) {
for (int x = 0; x < r.getWidth(); x++) {
total += r.getSample(r.getMinX() + x, r.getMinY() + y, 0);
}
}
return (int)(total / ((r.getWidth()/factorD)*(r.getHeight()/factorD)));
}
// returns true if image pair is considered a match
public boolean match() {
return this.match;
}
// buffered images are just better.
protected static BufferedImage imageToBufferedImage(Image img) {
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.drawImage(img, null, null);
return bi;
}
// write a buffered image to a jpeg file.
protected static void saveJPG(Image img, String filename) {
BufferedImage bi = imageToBufferedImage(img);
FileOutputStream out = null;
try {
out = new FileOutputStream(filename);
} catch (java.io.FileNotFoundException io) {
System.out.println("File Not Found");
}
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(0.8f,false);
encoder.setJPEGEncodeParam(param);
try {
encoder.encode(bi);
out.close();
} catch (java.io.IOException io) {
System.out.println("IOException");
}
}
// read a jpeg file into a buffered image
protected static Image loadJPG(String filename) {
FileInputStream in = null;
try {
in = new FileInputStream(filename);
} catch (java.io.FileNotFoundException io) {
System.out.println("File Not Found");
}
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
BufferedImage bi = null;
try {
bi = decoder.decodeAsBufferedImage();
in.close();
} catch (java.io.IOException io) {
System.out.println("IOException");
}
return bi;
}
}
En el método main debemos ir calibrando a nuestras necesidades
package comparacionimagen;
/**
*
* @author Paulo
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Especificamos las imagenes que deseamos comparar, cada imagene debe tener una dimension de 300 x 225.
ImageCompare ic = new ImageCompare("e:\\test1.jpg", "e:\\test5.jpg");
// Set the comparison parameters.
// (numero de regiones verticales, numero de regiones horizontales, sensibilidad, stabilizer)
ic.setParameters(12, 12, 15, 10);
// Display some indication of the differences in the image.
ic.setDebugMode(2);
// Compare.
ic.compare();
// Display if these images are considered a match according to our parameters.
System.out.println("Match: " + ic.match());
// si las imagenes son distintas se creará una nueva imagen con nombre changes.jpg en la que se muestre las regiones que son distintas pues sobrepasan la sensibilidad.
if (!ic.match()) {
ImageCompare.saveJPG(ic.getChangeIndicator(), "e:\\changes.jpg");
}
}
}
Información tomada de http://mindmeat.blogspot.com/2008/07/java-image-comparison.html