Mettre en évidence les différences entre les images
Il y a cette image de comparaison de code je suis censé modifier pour surligner ou souligner la différence entre les deux images. Est-il un moyen de modifier ce code afin de mettre en évidence les différences dans les images. Si pas toute suggestion sur la façon d'aller à ce sujet, il serait grandement apprécié.
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);
- Je suis en supposant que vous êtes à l'aide d'un
BufferedImage
classe? Ce montage est assez simple. Tout ce que vous avez à faire est de définir chaque pixel de votre image à la différence. Je vais écrire une réponse pour vous.
Vous devez vous connecter pour publier un commentaire.
Ce que je voudrais faire est de définir chaque pixel de faire la différence entre un pixel dans une image et le pixel correspondant dans l'autre image. La différence qui est calculé dans votre code original est basé sur le L1 norme. Ceci est aussi appelé le somme des différences absolues trop. En tout cas, écrire une méthode qui permettrait de prendre dans vos deux images, et renvoie une image de la même taille que définit chaque endroit à l'écart pour chaque paire de pixels qui partagent le même emplacement dans l'image finale. Fondamentalement, cela vous donnera une indication selon laquelle les pixels sont différents. Le plus blanc, le pixel, plus la différence qui existe entre ces deux emplacements correspondants.
Je vais aussi supposer que vous êtes à l'aide d'un
BufferedImage
classe, commegetRGB()
méthodes sont utilisées et vous êtes de décalage de bits pour accéder à des canaux individuels. En d'autres termes, une méthode qui ressemble à ceci:Pour appeler cette méthode, il suffit de faire:
C'est en supposant que vous êtes à l'appel de cette dans une méthode de la classe. Amusez-vous et bonne chance!
Cette solution a fonctionné pour moi. Il met en évidence les différences, et a la meilleure performance de l'méthodes que j'ai essayé. (Hypothèses: les images sont de la même taille. Cette méthode n'a pas été testé avec des transparents.)
Moyenne de temps de comparer un 1600x860 image PNG 50 fois (sur la même machine):
Quelqu'un a une meilleure, plus rapide solution?
Utilisation:
Un peu d'inspiration...
out of bound exception
. Je voulais seulement mettre en évidence les différences dans le disons haut à droite de l'image.BufferedImage.getRGB
pour un "carré" de la gamme... docs.oracle.com/javase/7/docs/api/java/awt/image/...