Como calcular discreta cosseno transformada (DCT) em PHP?

O que eu gostaria aqui é uma versão otimizada e funcional do meu código atual. Embora minha função retorne uma matriz com resultados reais, não sei se estão corretos (não sou um guru de matemática e não sei código Java para comparar meus resultados com implementações conhecidas). Em segundo lugar, gostaria que a função aceitasse tamanhos de tabela personalizados, mas não sei como fazer isso. O tamanho da tabela é equivalente a uma nova amostra da imagem? Estou aplicando os coeficientes corretamente?

// 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;
}

Minha função PHP é derivada deste post em Java:Problemas com o algoritmo DCT e IDCT em java. Eu reescrevi o código para php e legibilidade. Por fim, estou trabalhando em um script que me permitirá comparar imagens e encontrar semelhanças. A técnica é descrita aqui:http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html.

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion