使用DCT解压缩Opencv阻止人工制品

时间:2014-12-10 18:27:39

标签: c++ opencv compression computer-vision

我试图在opencv中使用DCT压缩图像,并且在解压缩时获得的伪像比我预期的要多。

我的压缩过程是:

Take DCT of 8x8 blocks in image
Do element-wise division of each 8x8 block by the given quantisation matrix
Round all elements to the nearest whole number

我的减压过程是:

Take 8x8 blocks of the DCT and do element-wise multiplication by the quantisation matrix
Perform an inverse DCT

我在每个通道的YCrCb空间中执行此操作,并使用cv :: divide和cv :: multiply进行元素划分和乘法运算。对于量化矩阵,我使用此处显示的JPEG标准矩阵http://www.impulseadventure.com/photo/jpeg-quantization.html(标题为JPEG标准)。我将亮度矩阵应用于Y通道,将色度矩阵应用于Cr和Cb通道。

最后是图像:

Before Image

enter image description here

不幸的是,我无法分享代码。但我会尽我所能回答人们的任何问题。

2 个答案:

答案 0 :(得分:1)

图像的DCT系数被标记为具有负值的两倍。在对元素进行量化和舍入后,我将矩阵从CV_64FC3类型转换为CV_8UC3,期望将static_cast的等效值应用于元素。

然而,当从64F转换为8UC时,OpenCV将所有负值归零,导致信息丢失,从而导致阻塞。

解决方案是应用静态强制转换将double转换为unsigned char并将其写入返回的数组,而不是使用opencv convert函数。

答案 1 :(得分:0)

这可能是它应该看起来的样子,你可能已经量化了很多导致这种模式的系数。当您想要丢弃大量信息以节省更多图像大小时,这些工件会在jpeg压缩中出现。

您的搜索结果与此Wiki页面底部显示的图像类似 http://en.wikipedia.org/wiki/JPEG

可能是您应该降低量化级别以获得更高质量的图像。