如何使用php计算图像的2D DCT?

时间:2015-07-03 06:36:26

标签: php arrays image dct

我试图使用php找到图像的2D DCT(离散余弦变换)。我用下面的等式来找到它。 enter image description here

enter image description here

enter image description here

以下是我用来查找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.

例如: -

  

数组([0] =&gt;数组(...,3 =&gt; 0 [4] =&gt; 0 [5] =&gt; 0,...

我认为问题出在我的计算中。我做错了什么?请帮我 谢谢。

1 个答案:

答案 0 :(得分:1)

以下是基于评论的答案:

$颜色不好。你是在1D中初始化它,但你在数学运算中称它为就像是一个2D数组。在你的数学运算中,用$ color [$ i * 32 + $ j]替换$ color [$ i] [$ j]它应该可以工作我猜...或者确保你的$ color数组按照你的预期形成