2012-04-20 121 views
0

任何人都可以告诉我如何在C++中以8 x 8块的形式分割JPEG图像。在C++中以块分割jpeg图像

谢谢。

+0

你已经在内存中的图像,并准备对它执行DCT? – GManNickG 2012-04-20 18:26:06

+0

是的。 – NiVeR 2012-04-20 18:28:43

+0

我还有点不清楚。你的意思是你有内存中的压缩数据吗?如果是这样,你会想要执行* inverse * DCT来恢复空间数据。在这种情况下,它已经被分成了8x8块。如果你在内存中有“原始”像素,并且想要进行JPEG压缩,那么你会将它分解为8x8块,然后在每个块上进行DCT。 – 2012-04-20 18:43:53

回答

1

你必须解压缩图像,使用turbojpg库(速度非常快),它会给你一组unsigned char作为RGB(或RGBA)。现在你有一个未压缩的图像,它分别具有R G和B的字节值。

你可以从这里开始做一个简单的循环,它将通过3 * 8 char块并使用memcpy复制它们到其他一些内存位置。

您必须记住,从turbojpg库返回的数组是一维字节的线性数组。所以扫描线一个接一个地存储。在创建块时考虑到这一点,根据您的需要而定,您必须以不同的方式遍历数组。

+0

我想不使用任何外部库。 – NiVeR 2012-04-20 18:22:39

+0

所以你想自己编写JPEG解压缩函数吗?朋友,从经验中,我可以告诉你,如果你想要任何体面的速度,这并不容易! – 2012-04-20 18:24:04

+0

首先,我想打开图像并以8×8像素块表示,但唯一的办法是我可以想到复杂度为O(w * h)其中w和h是图片的重量和高度,这当然太慢了。 – NiVeR 2012-04-20 18:27:12

2

嗯,这个顽固的方法。我的心向你倾诉。预计会学到很多东西,但要预先警告你会失去时间,血液和痛苦。

Compression FAQ有关于JPEG如何工作的一些细节。一个好的起点是第2部分:主题75:JPEG简介。

概括地说,对于一个典型的JPEG文件,你将不得不逆转编码步骤6至4:

  1. (6)提取从JFIF容器
  2. 适当的报头和图像数据( 5)逆转Huffman编码
  3. (4)反向量化

,那么你应该留下8×8块,你可以喂到合适的逆DCT。

维基百科有关于JFIF格式以及JFIF中的霍夫曼表和structure of the JPEG数据的一些细节。

我假设你正在寻找使用JPEG来了解它?因为如果你有一些实际的应用,访问原始编码块几乎肯定不是必需的。

在看到评论后编辑:如果您只是想在不读取/解压缩整个文件的情况下获得非常大的JPEG的一部分,则可以使用ImageMagick的stream命令。它允许你在不读取整个文件的情况下获取子图像。使用像例如从(16,16)开始获得一个8x8块。

+0

我对学习和开发感兴趣面向未来的人脸识别软件。但现在我想学习基础知识。 – NiVeR 2012-04-20 19:32:11