Percentage difference between images: Difference between revisions
Content added Content deleted
(→{{header|Java}}: restructure code to be reusable) |
|||
Line 735: | Line 735: | ||
<lang java>import java.awt.image.BufferedImage; |
<lang java>import java.awt.image.BufferedImage; |
||
import |
import java.io.File; |
||
import java.io.IOException; |
import java.io.IOException; |
||
import |
import javax.imageio.ImageIO; |
||
public |
public enum ImgDiffPercent { |
||
⚫ | |||
{ |
|||
public static void main(String |
public static void main(String[] args) throws IOException { |
||
{ |
|||
⚫ | |||
BufferedImage img1 = null; |
|||
// https://rosettacode.org/mw/images/b/b6/Lenna100.jpg |
|||
BufferedImage img2 = null; |
|||
BufferedImage img1 = ImageIO.read(new File("Lenna50.jpg")); |
|||
try { |
|||
BufferedImage img2 = ImageIO.read(new File("Lenna100.jpg")); |
|||
⚫ | |||
double p = getDifferencePercent(img1, img2); |
|||
System.out.println("diff percent: " + p); |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
} |
||
int width1 = img1.getWidth(null); |
|||
private static double getDifferencePercent(BufferedImage img1, BufferedImage img2) { |
|||
⚫ | |||
int |
int width = img1.getWidth(); |
||
int |
int height = img1.getHeight(); |
||
int width2 = img2.getWidth(); |
|||
⚫ | |||
System.err.println("Error: Images dimensions mismatch"); |
|||
if (width != width2 || height != height2) { |
|||
System.exit(1); |
|||
throw new IllegalArgumentException(String.format("Images must have the same dimensions: (%d,%d) vs. (%d,%d)", width, height, width2, height2)); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
for (int x = 0; x < width; x++) { |
|||
diff += pixelDiff(img1.getRGB(x, y), img2.getRGB(x, y)); |
|||
} |
|||
} |
|||
long maxDiff = 3L * 255 * width * height; |
|||
return 100.0 * diff / maxDiff; |
|||
} |
} |
||
⚫ | |||
private static int pixelDiff(int rgb1, int rgb2) { |
|||
⚫ | |||
int rgb1 = img1.getRGB(x, y); |
|||
int rgb2 = img2.getRGB(x, y); |
|||
int r1 = (rgb1 >> 16) & 0xff; |
int r1 = (rgb1 >> 16) & 0xff; |
||
int g1 = (rgb1 >> 8) & 0xff; |
int g1 = (rgb1 >> 8) & 0xff; |
||
int b1 = |
int b1 = rgb1 & 0xff; |
||
int r2 = (rgb2 >> 16) & 0xff; |
int r2 = (rgb2 >> 16) & 0xff; |
||
int g2 = (rgb2 >> 8) & 0xff; |
int g2 = (rgb2 >> 8) & 0xff; |
||
int b2 = |
int b2 = rgb2 & 0xff; |
||
return Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2); |
|||
diff += Math.abs(g1 - g2); |
|||
diff += Math.abs(b1 - b2); |
|||
⚫ | |||
} |
} |
||
double n = width1 * height1 * 3; |
|||
double p = diff / n / 255.0; |
|||
System.out.println("diff percent: " + (p * 100.0)); |
|||
} |
|||
}</lang> |
}</lang> |
||