0

我正在尝试为彩色 JPEG 实现基于 DCT 的图像压缩算法。我是图像处理的新手,所以我需要一些帮助。我需要的是澄清算法。

我从这里使用 DCT 实现

所以,这是我理解的算法:

  1. 使用 ImageIO 将图像加载到 BufferedImage 中。
  2. 创建 3 个矩阵(每个通道 1 个:红色、绿色、蓝色):

    int rgb = bufferedImage.getRGB(i, j);
    int red = (rgb >> 16) & 0xFF;
    int green = (rgb >> 8) & 0xFF;
    int blue = rgb & 0xFF;
    
  3. 将矩阵增加到大小,以便它们可以分成 8x8 的块(其中 8 是 DCT 矩阵的大小,N)

  4. 对于每个矩阵,将其拆分为 8x8 大小的块(结果:splittedImage)
  5. 对来自 splittedImage 的矩阵执行 forwardDCT(结果:dctImage)。
  6. 对来自 dctImage 的矩阵执行量化(结果:quantizedImage)

在这里我不知道该怎么办。我可以:

  • 将 quantizedImage 矩阵合并为一个矩阵 margedImage,将其转换为 Vector 并执行 compressImage 方法。
  • 或者将小矩阵从quantizedImage转换成Vector,对它们执行compressImage方法,然后将它们margin成一个矩阵

所以,在这里我得到了红色、绿色和蓝色的 3 个矩阵。然后我将这些矩阵转换为一个 RGB 矩阵并创建新的 BufferedImage 并使用方法 setRGB 来设置像素值。然后执行将图像保存到文件。

额外问题:

  1. 将RGB转换为YCbCr并在Y,Cb和Cr上执行DCT更好吗?
  2. compressImage 方法的 Javadoc 说它不是 Huffman 编码,而是 Run-Length 编码。那么压缩后的图像会被图像查看器打开吗?或者我应该根据JPEG规范使用霍夫曼编码,Java中有没有开源的霍夫曼编码实现?
4

1 回答 1

1

如果您想遵循实施步骤,我建议您阅读:

http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=sr_1_1?ie=UTF8&qid=1399765722&sr=8-1&keywords=compressed+image+file+formats

关于您的问题:

1) JPEG 标准对色彩空间一无所知,也不关心您使用的是 RGB 还是 YCbCr 或 CMYK。有几种 JPEG 文件格式(例如,JFIF、EXIF、ADOBE)指定颜色空间——通常是 YCbCr。

使用 YCbCr 的原因是如果遵循 JPEG 集中信息的趋势。Y 分量往往比 Cb 或 Cr 分量有更多有用的信息。使用 YCbCr,您可以为每个 Cb 采样 4 个 Y,为每个 Y 采样 Cr(甚至 16 个)。这将要压缩的数据量减少了 1/2。

请注意,JPEG 文件格式指定了采样限制(JPEG 允许 2:3 采样,而大多数实现不允许)。

2) DCT 系数经过游程编码,然后进行霍夫曼(或算术)编码。你必须同时使用两者。

于 2014-05-10T23:57:49.180 回答