【问题标题】:How to calculate 2D DCT of an image using php?如何使用 php 计算图像的 2D DCT?
【发布时间】:2015-09-20 21:37:36
【问题描述】:

我正在尝试使用 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()function,它会给出一个数组,其中所有元素的值都为 0。

例如:-

数组 ( [0] => 数组 (... ,3 => 0 [4] => 0 [5] => 0,...

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

【问题讨论】:

  • 不应该有 $M 而不是 $N 在第二个 for 循环和 sqrt(2/$N);
  • $M 和 $N 的大小相同 (32)。所以,我希望这不是问题
  • $color 不好。您在 1D 中对其进行初始化,但在数学运算中将其称为 2D 数组。在您的数学运算中,将 $color[$i][$j] 替换为 $color[$i*32+$j] 我猜它应该可以工作...或者确保您的 $color 数组按您的预期形成,也许通过应用一个 var_dump() 调用
  • @niconoe 我将 applyDCT 函数中的 $color[]=$this->getGray($img,$i,$j) 更改为 $color[$i][$j]=$this- >getGray($img,$i,$j)。现在它给出了一些值。为什么你说在数学运算中用 $color[$i*32+$j] 替换 $color[$i][$j] ?现在我也应该这样做吗?
  • 不,只有当您计划将 $color 保留为一维数组时,才能使用此技巧。 $i*32+$j 是从 2D 转换为 1D 数字索引数组(当前行 * nb 列 + 当前列)的技巧,但您不再需要它,因为您的 $color 现在是 2D 数组;) .您要我回答以便您接受并解决您的问题吗?问候,

标签: php arrays image dct


【解决方案1】:

以下是基于 cmets 的答案:

$color 不好。您在 1D 中对其进行初始化,但在数学运算中将其称为 2D 数组。在您的数学运算中,将 $color[$i][$j] 替换为 $color[$i*32+$j] 我猜它应该可以工作...或者确保您的 $color 数组按您的预期形成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多