根据这个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
的
我知道我需要删除的系数位于每个块的右下角,但是正确删除或丢弃它们的最佳方法是什么?
答案 0 :(得分:0)
我认为,简单地丢弃高频成分是行不通的。你的观察也证明了这一点。因为,当你平均2x2或4x4块时,你不会完全丢弃某个高频分量。相反,你会降低他们对低频的能量水平。因此,完全降低到零并不是一个好主意。
我认为,你没有足够注意高频的真正含义。请对图像应用Sobel或Prewitt边缘检测并对其进行二值化。然后查询该二进制图像上的每个像素,无论它是边缘的一部分还是被丢弃。如果它是边缘的一部分,则通过“排除”当前像素对原始图像应用平均滤镜。现在,猜猜它是什么样的?