Jak obliczyć dyskretną transformację kosinusową (DCT) w PHP?

To, co chciałbym tutaj, to działająca, zoptymalizowana wersja mojego obecnego kodu. Podczas gdy moja funkcja zwraca tablicę z rzeczywistymi wynikami, nie wiem, czy są poprawne (nie jestem guru matematyki i nie znam kodu Java do porównywania moich wyników ze znanymi implementacjami). Po drugie, chciałbym, aby funkcja mogła akceptować niestandardowe rozmiary tabel, ale nie wiem, jak to zrobić. Czy rozmiar tabeli jest równoważny z ponownym próbkowaniem obrazu? Czy poprawnie stosuję współczynniki?

// a lot of processing is required for large images
$image = imagecreatetruecolor(21, 21);
$black = imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledellipse($image, 10, 10, 15, 15, $white);

print_r(imgDTC($image));

function imgDTC($img, $tableSize){
    // m1 = Matrix1, an associative array with pixel data from the image
    // m2 = Matrix2, an associative array with DCT Frequencies
    // x1, y1 = coordinates in matrix1
    // x2, y2 = coordinates in matrix2
    $m1 = array();
    $m2 = array();

    // iw = image width
    // ih = image height
    $iw = imagesx($img);
    $ih = imagesy($img);

    // populate matrix1
    for ($x1=0; $x1<$iw; $x1++) {
        for ($y1=0; $y1<$ih; $y1++) {
            $m1[$x1][$y1] = imagecolorat($img, $x1, $y1) & 0xff;
        }
    }

    // populate matrix2
    // for each coordinate in matrix2
    for ($x2=0;$x2<$iw;$x2++) {
        for ($y2=0;$y2<$ih;$y2++) {

        // for each coordinate in matrix1
            $sum = 1;
            for ($x1=0;$x1<$iw;$x1++) {
                for ($y1=0;$y1<$ih;$y1++) {
                    $sum += 
                        cos(((2*$x1+1)/(2*$iw))*$x2*pi()) * 
                        cos(((2*$y1+1)/(2*$ih))*$y2*pi()) * 
                        $m1[$x1][$y1]
                    ;
                }
            }

            // apply coefficients
            $sum *= .25;
            if ($x2 == 0 || $y2 == 0) {
                $sum *= 1/sqrt(2);
            }

            $m2[$x2][$y2] = $sum;
        }
    }
    return $m2;
}

Moja funkcja PHP jest pochodną tego postu w Javie:Problemy z algorytmem DCT i IDCT w Javie. Przepisałem kod na php i czytelność. Ostatecznie pracuję nad skryptem, który pozwoli mi porównać obrazy i znaleźć podobieństwa. Technika jest tu opisana:http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html.

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion