c++ - 从 JPG 图像中去除高频系数

标签 c++ compression jpeg

基于此question's回答,我需要在解压缩过程中从我的图像中删除高频 DCT 系数以获得更小的图像。

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

 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 的数组

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

最佳答案

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

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

关于c++ - 从 JPG 图像中去除高频系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8666658/

相关文章:

c# - zlib 的 gzip 压缩和 .NET 的 GZipStream 使用的压缩有什么区别?

ios - AVFoundation 或 VideoToolbox JPEG 压缩

php - 使用 PHP 从办公文件(.doc .ppt 等)生成 JPG

c++ - 是否只允许在一个表达式中使用 float 缩写?

c# - 在 C# 中调用 C++ 库

algorithm - Deflate 压缩 - 数值示例

javascript - 在通过套接字发送到客户端之前压缩中等大小的 JavaScript 数组是否值得?

image - JPG 与 PNG 的 AS3 CPU 性能

c++ - 如何跨平台将 char* 转换为 long long(64 位)?

c++ - 可变参数模板类,用于延迟调用可变参数模板函数