我正在尝试为彩色 JPEG 实现基于 DCT 的图像压缩算法。我是图像处理的新手,所以我需要一些帮助。我需要的是澄清算法。
所以,这是我理解的算法:
- 使用 ImageIO 将图像加载到 BufferedImage 中。
创建 3 个矩阵(每个通道 1 个:红色、绿色、蓝色):
int rgb = bufferedImage.getRGB(i, j); int red = (rgb >> 16) & 0xFF; int green = (rgb >> 8) & 0xFF; int blue = rgb & 0xFF;
将矩阵增加到大小,以便它们可以分成 8x8 的块(其中 8 是 DCT 矩阵的大小,N)
- 对于每个矩阵,将其拆分为 8x8 大小的块(结果:splittedImage)
- 对来自 splittedImage 的矩阵执行 forwardDCT(结果:dctImage)。
- 对来自 dctImage 的矩阵执行量化(结果:quantizedImage)
在这里我不知道该怎么办。我可以:
- 将 quantizedImage 矩阵合并为一个矩阵 margedImage,将其转换为 Vector 并执行 compressImage 方法。
- 或者将小矩阵从quantizedImage转换成Vector,对它们执行compressImage方法,然后将它们margin成一个矩阵
所以,在这里我得到了红色、绿色和蓝色的 3 个矩阵。然后我将这些矩阵转换为一个 RGB 矩阵并创建新的 BufferedImage 并使用方法 setRGB 来设置像素值。然后执行将图像保存到文件。
额外问题:
- 将RGB转换为YCbCr并在Y,Cb和Cr上执行DCT更好吗?
- compressImage 方法的 Javadoc 说它不是 Huffman 编码,而是 Run-Length 编码。那么压缩后的图像会被图像查看器打开吗?或者我应该根据JPEG规范使用霍夫曼编码,Java中有没有开源的霍夫曼编码实现?