从JPG图像中删除高频系数

时间:2011-12-29 10:27:24

标签: c++ compression jpeg

根据这个question's答案,我需要在解压缩过程中从我的图像中删除高频DCT系数,以获得更小的图像。

我一直在寻找一种方法来做到这一点,而且似乎并非那么简单。我有以下两个循环在我的代码中执行IDCT,并在8 x 8块的子集上执行循环,只给出非常失真的图像。

 for (coef = 0;  coef < 64;  coef +=8)
        njRowIDCT(&nj.block[coef]); //Inverse Discrete Cosine Transform
    for (coef = 0;  coef < 8;  ++coef)
        njColIDCT(&nj.block[coef], &out[coef], c->stride);  // Inverse Discrete Cosine Transform

block是一个包含64 int

的数组

我知道我需要删除的系数位于每个块的右下角,但是正确删除或丢弃它们的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为,简单地丢弃高频成分是行不通的。你的观察也证明了这一点。因为,当你平均2x2或4x4块时,你不会完全丢弃某个高频分量。相反,你会降低他们对低频的能量水平。因此,完全降低到零并不是一个好主意。

我认为,你没有足够注意高频的真正含义。请对图像应用Sobel或Prewitt边缘检测并对其进行二值化。然后查询该二进制图像上的每个像素,无论它是边缘的一部分还是被丢弃。如果它是边缘的一部分,则通过“排除”当前像素对原始图像应用平均滤镜。现在,猜猜它是什么样的?