java — вычисление среднеквадратической ошибки двух изображений в переполнении стека

Я придумаю следующий код для вычисления среднеквадратической ошибки двух изображений с использованием PHP.

<?php
$image1 = "../../Uploads/spiderman_in_iran-wallpaper-1920x1080.jpg";
$image2 = "../../Downloads/spiderman_in_iran-wallpaper-1920x1080.jpg_encoded.jpg";
$ima = ImageCreateFromJPEG($image1);
$imb = ImageCreateFromJPEG($image2);
$width = imagesx($ima);
$height = imagesy($imb);
$delta = 0;
for ($cy=0;$cy<$height;$cy++)
for ($cx=0;$cx<$width;$cx++)
{
$rgba = ImageColorAt($ima, $cx, $cy);
$rgbb = ImageColorAt($imb, $cx, $cy);
$ra = ($rgba >> 16) & 0xFF;
$ga = ($rgba >> 8) & 0xFF;
$ba = $rgba & 0xFF;
$rb = ($rgbb >> 16) & 0xFF;
$gb = ($rgbb >> 8) & 0xFF;
$bb = $rgbb & 0xFF;
$delta = $delta + abs($ra-$rb) + abs($ga-$gb) + abs($ba-$bb);
}
$maxDiff = $width * $height;
echo 100 * $delta / $maxDiff;
?>

Но следующий код Java из другого источника умножил результат width * height на 3 и 255. Почему они это сделали? и выше PHP код в порядке?

    private static double getDifferencePercent(BufferedImage img1, BufferedImage img2) {
int width = img1.getWidth();
int height = img1.getHeight();
int width2 = img2.getWidth();
int height2 = img2.getHeight();
if (width != width2 || height != height2) {
throw new IllegalArgumentException(String.format("Images must have the same dimensions: (%d,%d) vs. (%d,%d)", width, height, width2, height2));
}

long diff = 0;
for (int y = 0; y < height; y++) {
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 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;
return Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2);
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]