【发布时间】:2013-04-25 17:44:34
【问题描述】:
libjpeg 中的函数是否像 matlab 中的 imread 一样输出图像矩阵?
【问题讨论】:
标签: c matlab image-processing libjpeg
libjpeg 中的函数是否像 matlab 中的 imread 一样输出图像矩阵?
【问题讨论】:
标签: c matlab image-processing libjpeg
来自 libjpeg v9 发行说明 (http://www.ijg.org/files/):
像素由扫描线存储,每条扫描线从左到 对。每个像素的分量值在行中是相邻的;为了 例如,R,G,B,R,G,B,R,G,B,... 用于 24 位 RGB 颜色。每条扫描线都是一个 数据类型 JSAMPLE 的数组——通常是“无符号字符”,除非 你已经改变了 jmorecfg.h。 (您还可以更改 RGB 像素布局,例如 通过修改 jmorecfg.h 为 B、G、R 顺序。但请参阅中列出的限制 之前的那个文件。)
一个二维像素数组是通过创建一个指向 扫描线的开始;所以扫描线不需要物理上相邻 在记忆中。即使您一次只处理一条扫描线,您也必须 制作一个单元素指针数组以符合此结构。 指向 JSAMPLE 行的指针是 JSAMPROW 类型的,指向 指针数组的类型是 JSAMPARRAY。
图书馆接受或提供一个或多个完整的扫描线 称呼。一次处理行的一部分是不可能的。 扫描线总是从上到下处理。您可以处理一个 如果您将所有图像都保存在内存中,则可以一次调用整个图像,但通常 一次处理一条扫描线是最简单的。
关键部分是:
通过指针列表形成二维像素数组
这意味着库本身不会返回像素“矩阵”;相反,它返回行(扫描线),用户负责将这些扫描线排列成“矩阵”。这不是太具有挑战性,但需要做一些工作。以下代码 sn-p 显示了 JPEG 解压缩的工作示例:
while (decompressor.output_scanline < decompressor.output_height)
{
pRow = &jpegInputBuffer[decompressor.output_scanline*rowStride];
jpeg_read_scanlines(&decompressor, &pRow, 1);
}
请注意,我省略了一些细节(pRow 的定义、rowStride、decompressor 结构的加载方式等)因为这些似乎超出了问题的范围。
【讨论】: