DCT实施

时间:2014-04-21 18:49:18

标签: java algorithm image-processing jpeg dct

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

我正在使用here

中的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(结果:dctImage)中的矩阵执行forwardDCT。
  6. 从dctImage对矩阵执行量化(结果:量化图像)
  7. 我不知道该怎么办。我可以:

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

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

    额外问题:

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

1 个答案:

答案 0 :(得分: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,您可以为每个Y为Cb和Cr(甚至16)采样4个Y.这样可以将要压缩的数据量减少1/2。

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

2)DCT系数是游程编码,然后是霍夫曼(或算术)编码。你必须使用两者。