dongtang1997
2015-07-03 06:36
浏览 95
已采纳

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

I'm trying to find 2D DCT(The Discrete Cosine Transform) of an image using php. I have used the following equation to find it. enter image description here

enter image description here

enter image description here

Here is the code I have used to find the 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;
}

The image size is 32*32. My problem is, once I call the applyDCT()function it gives an array which has all the element values as 0.

eg:-

Array ( [0] => Array (... ,3 => 0 [4] => 0 [5] => 0,...

I think problem is in my calculation. What I am doing wrong? Please help me Thank you.

图片转代码服务由CSDN问答提供 功能建议

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

以下是我用来查找DCT的代码。

  function getGray($ img,$ x,$ y){
 $ col = imagecolorsforindex($ img,imagecolorat($ img,$ x,$ y)); 
返回 intval($ col ['red'] * 0.3 + $ col ['green'] * 0.59 + $ col ['blue'] * 0.11); 
} 
 
函数initCoefficients(){
 for($ i  = 1; $ i&lt; $ this-&gt; size; $ i ++)
 {
 $ c [$ i] = 1; 
} 
 $ c [0] = 1 / sqrt(2.0); 
return  $ c; 
} 
 
函数applyDCT($ imagePath){
 $ img = $ this-&gt; readImageTo($ imagePath,32,32); 
 $ color = array(); 
 
 for  ($ i = 0; $ i&lt; 32; $ i ++)
 {
 for($ j = 0; $ j&lt; 32; $ j ++)
 {
 $ color [] = $ this-&gt; getGray  ($ img,$ i,$ j); 
} 
} 
 
 $ N = 32; 
 
 
 $ n c =  $ this-&gt; initCoefficients(); 
 $ sum = 0; 
 for($ u = 0; $ u&lt; $ N; $ u ++){
 for($ v = 0; $ v&lt; $ N;  $ v ++){
 
 for($ i = 0; $ i&lt; $ N; $ i ++){
 for($ j = 0; $ j&lt; $ 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; 
} 
} 
返回$ F; 
} 
   
 
 

图像大小为 32 * 32 。 我的问题是,一旦我调用 applyDCT()函数,它就会给出一个数组,其中所有元素值都为0.

例如: -

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

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题