ここで欲しいのは、現在のコードの機能し、最適化されたバージョンです。私の関数は実際の結果を含む配列を返しますが、それらが正しいかどうかはわかりません(私は数学の第一人者ではなく、結果を既知の実装と比較するJavaコードもわかりません)。次に、関数がカスタムテーブルサイズを受け入れることができるようにしたいのですが、その方法がわかりません。テーブルサイズは画像のリサンプリングと同等ですか?係数を正しく適用していますか?
// 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;
}
私のPHP関数は、Javaのこの投稿から派生したものです:JavaのDCTおよびIDCTアルゴリズムの問題。phpと読みやすさのためにコードを書き直しました。最終的に、私は画像を比較して類似点を見つけることができるスクリプトに取り組んでいます。この手法の概要は次のとおりです:http ://www.hackerfactor.com/blog/index.php?/ archives/432-Looks-Like-It.html 。
ありがとう!