вычисление среднеквадратической ошибки двух изображений в PHP - PullRequest
0 голосов
/ 05 января 2019

Я придумаю следующий код для вычисления среднеквадратической ошибки двух изображений с использованием 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);
    }
...