首页
学习
活动
专区
圈层
工具
发布

DCT实现
EN

Stack Overflow用户
提问于 2014-04-21 18:49:18
回答 1查看 3.3K关注 0票数 0

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

我正在使用这里的离散余弦变换实现

因此,下面是我所理解的算法:

  1. 使用ImageIO将图像加载到BufferedImage中。
  2. 创建3个矩阵(每个通道一个:红色、绿色、蓝色): 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. 对来自forwardDCT的矩阵执行splittedImage (结果: dctImage)。
  6. 从dctImage对矩阵执行量化(结果: quantizedImage)

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

  • 将quantizedImage矩阵合并为一个矩阵margedImage,将其转换为向量并执行compressImage方法。
  • 或将小矩阵从quantizedImage转换为向量并对其执行compressImage方法,然后将它们标记为一个矩阵。

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

额外问题:

  1. 将RGB转换为YCbCr并对Y、Cb和Cr进行离散余弦变换是否更好?
  2. compressImage方法的Javadoc说它不是Huffman编码,而是运行长度编码。那么,压缩后的图像会被图像查看器打开吗?或者我应该按照JPEG规范使用Huffman编码,在Java中有开源的Huffman编码实现吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-10 23:57:49

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

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和Cr (甚至16)进行4Ys的采样,这将压缩1/2的数据量。

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

2)离散余弦变换系数采用游程编码,哈夫曼(或算术)编码。你必须两者兼用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23203778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档