【问题标题】:Fourier Transform and Image Compression傅里叶变换和图像压缩
【发布时间】:2015-12-28 13:22:21
【问题描述】:

我将所有像素的 RGB 值输入到

R=[], G=[], B=[]

图片中的数组。它们是包含数组的 8 位 [0-255] 值。而且我需要使用傅里叶变换以有损方法压缩图像。

傅里叶变换

N 将是像素数。 n 是 i 的数组。 k 和假想的 j 会是什么?

我可以把这个方程实现成编程语言并得到压缩的图像文件吗?

或者我需要使用转换方程而不是 RGB 来获得不同的值?

【问题讨论】:

  • 您使用什么语言工作?如果你真的想自己实现这个方程,你可能应该使用标准的复数类型。 k 值似乎是针对正在计算的傅立叶系数。
  • 我正在使用 C#。但我也可以使用 Java。
  • 我为您的问题推荐了一些更合适的标签。您是否能够使用预先构建的 FFT 而不是自己构建一个?您可能还想单独在每个通道上执行 FFT。 FWIW,通常转换为 YUV 颜色空间并对 UV 通道进行下采样。
  • 感谢你们伟大的 cmets。我还需要构建 FFT:/
  • 无论如何,最好的办法是查看 JPEG 的工作原理并实施类似的解决方案 en.wikipedia.org/wiki/JPEG。在 JPEG 中,首先对 YUV 通道应用 2D 离散余弦变换,然后应用量化矩阵来降低不太重要的 DCT 系数的精度。随后执行运行长度编码以进行实际压缩。你可能想做类似的事情。

标签: image-processing compression jpeg fft dct


【解决方案1】:

首先,是的,您应该从 RGB 转换为亮度空间,例如 YCbCr。人眼在亮度 (Y) 方面的分辨率比在颜色通道中的分辨率高,因此在相同的损失水平下,您可以比亮度更多地抽取颜色。通常首先将 Cb 和 Cr 通道的分辨率在两个方向上降低两倍,然后将颜色通道的大小降低四倍。 (查找色度二次采样。)

其次,您应该使用离散余弦变换 (DCT),它实际上是移过半步的样本的离散傅里叶变换的实部。 JPEG 所做的是将图像分解为每个通道的 8x8 块,并对每个块的每一列和每一行进行 DCT。然后直流分量在左上角,随着你向下和向左,交流分量的频率增加。您可以使用您喜欢的任何块大小,尽管 DCT 的总体计算时间会随着大小而增加,并且有损步骤的伪影将具有更广泛的范围。

现在您可以通过量化结果系数来使其有损,在较高频率中更是如此。结果通常会有很多小系数和零系数,然后可以通过游程和霍夫曼编码进行高度压缩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多