如何使用 php 计算图像的 2D DCT?
How to calculate 2D DCT of an image using php?
我正在尝试使用 php 查找图像的 2D DCT(离散余弦变换)。我用下面的等式来找到它。
这是我用来查找 DCT 的代码。
function getGray($img,$x,$y){
$col = imagecolorsforindex($img, imagecolorat($img,$x,$y));
return intval($col['red']*0.3 + $col['green']*0.59 + $col['blue']*0.11);
}
function initCoefficients() {
for ($i=1;$i<$this->size;$i++)
{
$c[$i]=1;
}
$c[0]=1/sqrt(2.0);
return $c;
}
function applyDCT($imagePath) {
$img = $this->readImageTo($imagePath, 32, 32);
$color=array();
for($i=0;$i<32;$i++)
{
for($j=0;$j<32;$j++)
{
$color[]=$this->getGray($img,$i,$j);
}
}
$N=32;
$c=$this->initCoefficients();
$sum=0;
for ($u=0;$u<$N;$u++) {
for ($v=0;$v<$N;$v++) {
for ($i=0;$i<$N;$i++) {
for ($j=0;$j<$N;$j++) {
$sum += ($c[$i]*$c[$j])*cos(((2*$i+1)*$u*pi()/(2.0*$N)))*cos(((2*$j+1)*$v*pi()/(2.0*$N)))*($color[$i][$j]);
}
}
$sum *=sqrt(2/$N)*sqrt(2/$N);
$F[$u][$v] = $sum;
}
}
return $F;
}
图片大小为32*32
。我的问题是,一旦我调用 applyDCT()
函数,它就会给出一个所有元素值为 0 的数组。
例如:-
Array ( [0] => Array (... ,3 => 0 [4] => 0 [5] => 0,...
我觉得我的计算有问题。我做错了什么?请帮我
谢谢。
以下是基于评论的答案:
$color不好。您在 1D 中初始化它,但在数学运算中调用它,就好像它是 2D 数组一样。在你的数学运算中,将 $color[$i][$j] 替换为 $color[$i*32+$j] 我猜它应该可以工作......或者确保你的 $color 数组按照你的预期形成
我正在尝试使用 php 查找图像的 2D DCT(离散余弦变换)。我用下面的等式来找到它。
这是我用来查找 DCT 的代码。
function getGray($img,$x,$y){
$col = imagecolorsforindex($img, imagecolorat($img,$x,$y));
return intval($col['red']*0.3 + $col['green']*0.59 + $col['blue']*0.11);
}
function initCoefficients() {
for ($i=1;$i<$this->size;$i++)
{
$c[$i]=1;
}
$c[0]=1/sqrt(2.0);
return $c;
}
function applyDCT($imagePath) {
$img = $this->readImageTo($imagePath, 32, 32);
$color=array();
for($i=0;$i<32;$i++)
{
for($j=0;$j<32;$j++)
{
$color[]=$this->getGray($img,$i,$j);
}
}
$N=32;
$c=$this->initCoefficients();
$sum=0;
for ($u=0;$u<$N;$u++) {
for ($v=0;$v<$N;$v++) {
for ($i=0;$i<$N;$i++) {
for ($j=0;$j<$N;$j++) {
$sum += ($c[$i]*$c[$j])*cos(((2*$i+1)*$u*pi()/(2.0*$N)))*cos(((2*$j+1)*$v*pi()/(2.0*$N)))*($color[$i][$j]);
}
}
$sum *=sqrt(2/$N)*sqrt(2/$N);
$F[$u][$v] = $sum;
}
}
return $F;
}
图片大小为32*32
。我的问题是,一旦我调用 applyDCT()
函数,它就会给出一个所有元素值为 0 的数组。
例如:-
Array ( [0] => Array (... ,3 => 0 [4] => 0 [5] => 0,...
我觉得我的计算有问题。我做错了什么?请帮我 谢谢。
以下是基于评论的答案:
$color不好。您在 1D 中初始化它,但在数学运算中调用它,就好像它是 2D 数组一样。在你的数学运算中,将 $color[$i][$j] 替换为 $color[$i*32+$j] 我猜它应该可以工作......或者确保你的 $color 数组按照你的预期形成