如何使用libjpeg获取图像的图像矩阵

时间:2013-04-25 17:44:34

标签: c matlab image-processing libjpeg

libjpeg中的任何函数是否都像matlab中的imread一样输出图像矩阵?

1 个答案:

答案 0 :(得分:3)

从libjpeg v9发行说明(http://www.ijg.org/files/):

  

像素由扫描线存储,每条扫描线从左到右运行   对。每个像素的分量值在行中相邻;对于   例如,R,G,B,R,G,B,R,G,B,......用于24位RGB颜色。每条扫描线都是   数据类型JSAMPLE ---它通常是“unsigned char”,除非   你改变了jmorecfg.h。 (也可以改变RGB像素布局   到B,G,R顺序,通过修改jmorecfg.h。但请参阅中列出的限制   这样做之前。)

     

通过制作指向列表的指针来形成2-D像素阵列   扫描线的开始;因此扫描线不需要在物理上相邻   在记忆中。即使您一次只处理一条扫描线,也必须如此   创建一个单元素指针数组以符合此结构。   指向JSAMPLE行的指针是JSAMPROW类型,指针指向   指针数组的类型为JSAMPARRAY。

     

该库接受或提供一个或多个完整的扫描线   呼叫。不可能一次处理一部分行。   扫描线始终从上到下进行处理。你可以处理一个   如果你把它全部留在记忆中,那么整个图像就会在一次通话中出现   最简单的方法是一次处理一条扫描线。

关键部分是:

  

通过制作指针列表

形成2-D像素阵列

这意味着库本身不会返回像素的“矩阵”;相反,它返回行(扫描线),用户负责将这些扫描线排列成“矩阵”。这不是太具有挑战性,但需要做一些工作。以下代码段显示了JPEG解压缩的工作示例:

while (decompressor.output_scanline < decompressor.output_height)
{
    pRow = &jpegInputBuffer[decompressor.output_scanline*rowStride];
    jpeg_read_scanlines(&decompressor, &pRow, 1);
}

请注意,我省略了许多细节( pRow 的定义, rowStride ,如何加载解压缩程序结构等)因为那些似乎超出了问题的范围。