Markieren Sie Unterschiede zwischen den Bildern
Es ist dieses Bild-Vergleich code soll ich ändern, markieren/Punkt heraus, den Unterschied zwischen zwei Bildern. Gibt es eine Möglichkeit, diesen code ändern, so markieren Sie die Unterschiede in Bildern. Wenn nicht, irgendeine Idee, wie es gehen würde sehr geschätzt werden.
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);
- Ich bin davon ausgegangen, dass Sie eine
BufferedImage
Klasse? Dieser edit ist ziemlich einfach. Alles, was Sie würde tun müssen, ist legen Sie jeden pixel in Ihrem Bild, um die Differenz. Ich Schreibe eine Antwort für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich tun würde, ist das set der jedes pixel die Differenz zwischen einem pixel in einem Bild und die entsprechenden pixel in dem anderen Bild. Die Differenz berechnet sich in deinem original-code basiert auf der L1 - norm. Dies wird auch als Summe der absoluten Differenzen zu. In jedem Fall, schreiben Sie eine Methode, die dauern würde, in Ihr zwei Bilder, und wieder ein Bild von der gleichen Größe, die festlegt, dass jeder Standort sein, der Unterschied für jedes paar von Pixeln, die denselben Standort in das endgültige Bild. Im Grunde, dies wird Ihnen einen Hinweis auf die Pixel unterschiedlich sind. Je weißer die pixel, desto mehr Unterschied gibt es zwischen diesen beiden entsprechenden Standorten.
Zudem werde ich auch davon aus, dass Sie mit einem
BufferedImage
KlassegetRGB()
Methoden verwendet werden und Sie sind bit-Verschiebung, um den Zugriff auf die einzelnen Kanäle. In anderen Worten, eine Methode, die wie folgt aussieht:Um diese Methode aufzurufen, einfach das zu tun:
Dies ist unter der Annahme, dass Sie fordern, diese innerhalb einer Methode der Klasse. Viel Spaß und viel Glück!
Diese Lösung hat den trick für mich. Es beleuchtet Unterschiede und hat die beste Leistung aus den Methoden, die ich ausprobiert habe. (Annahmen: die Bilder die gleiche Größe haben. Diese Methode wurde noch nicht getestet mit Folien.)
Durchschnittliche Zeit zum vergleichen eines 1600x860 PNG-Bild 50 mal (auf derselben Maschine):
Hat jemand eine bessere/schnellere Lösung?
Verwendung:
Einige inspiration...
out of bound exception
. Ich wollte nur hervorheben, Unterschiede in sagen wir oben rechts im Bild.BufferedImage.getRGB
auf eine bestimmte "square" - Reihe... docs.oracle.com/javase/7/docs/api/java/awt/image/...