什么是表示图像矩阵的理想数据结构?
What would be an ideal data structure to represent an image matrix?
当我在做计算机视觉库时,我想知道保存图像数据的理想数据结构是什么。
有人告诉我,std::vector 层叠是非常糟糕的,因为不能保证数据的连续性,因此简单的层叠更有效。
问题是,矢量的内容必须依赖于色彩空间。另外,对于大小问题,最好每个通道都有一个 unsigned char,尽管我最好让浮点数来执行操作。
为了处理色彩空间,我是否应该增加向量的大小(比如将其增加三倍以处理 RGB),以便我可以像这样访问数据:
data[0] => pixel 1, Red
data[1] => pixel 1, Green
data[2] => pixel 1, Blue
data[3] => pixel 2, Red
data[4] => pixel 2, Green
... etc
或者是否可以更有效地执行此操作(例如使用 long int 或 float 将所有通道的值保存在一个变量中),如果可以,怎么做?我怎样才能使这个通用处理 1、2、3 或 4 个通道,以便我可以(相对)轻松地更改色彩空间?
问题不在于容器(我已经在使用单个 std::vector),而是内容本身。
编辑:由于这个问题已被标记为主要基于意见,我会尽量让它更清楚。
目前,我正在 std::vector<float>
中存储图像数据。这里的问题是我不知道要存储多少项目(例如要处理的大小的 3 倍 RGB/HSV,或者即使我只使用一个项目(灰度)也实现 4 项目结构(RGBA) ?)以便在需要时有效地更改颜色空间或对矩阵执行操作。由于这是要集成到计算机视觉库中,因此极有可能每帧至少发生一次。
我在这里要求高效,这与意见无关(或很少)。可能有几个好的答案,从中选择取决于意见,但这应该是我的决定。
什么是图像数据的 "best" 数据结构在很大程度上取决于您要对图像执行哪种操作,并且主要取决于您希望优化性能的操作。
通常 std::vector
个字节就足够了(对于整个图像,不是每一行的向量);矢量保证数据存储在连续的内存块中,这可能适合也可能不适合您的用例(即,如果您需要管理比扫描线更长的步幅,则不适合)。
如果您需要更细粒度地访问像素格式信息(即单一颜色分量),您可能希望使用自定义结构来表示像素。
此外,数据结构可能会更复杂,具体取决于您需要管理的图像类型。
IE。您是否仅限于一种或几种像素格式?
您是否仅限于 "packed" 个图像(1 个 "plane" 中的连续颜色分量)或者您是否还需要管理 "planar" 个图像(多个 "planes",每个颜色分量一个)?
您还可以在网上查看一些可用的图形库。
一个(在我看来)具有有趣的像素组件管理(带有自定义迭代器和其他工具)的是 Boost GIL
当我在做计算机视觉库时,我想知道保存图像数据的理想数据结构是什么。
有人告诉我,std::vector 层叠是非常糟糕的,因为不能保证数据的连续性,因此简单的层叠更有效。
问题是,矢量的内容必须依赖于色彩空间。另外,对于大小问题,最好每个通道都有一个 unsigned char,尽管我最好让浮点数来执行操作。
为了处理色彩空间,我是否应该增加向量的大小(比如将其增加三倍以处理 RGB),以便我可以像这样访问数据:
data[0] => pixel 1, Red
data[1] => pixel 1, Green
data[2] => pixel 1, Blue
data[3] => pixel 2, Red
data[4] => pixel 2, Green
... etc
或者是否可以更有效地执行此操作(例如使用 long int 或 float 将所有通道的值保存在一个变量中),如果可以,怎么做?我怎样才能使这个通用处理 1、2、3 或 4 个通道,以便我可以(相对)轻松地更改色彩空间?
问题不在于容器(我已经在使用单个 std::vector),而是内容本身。
编辑:由于这个问题已被标记为主要基于意见,我会尽量让它更清楚。
目前,我正在 std::vector<float>
中存储图像数据。这里的问题是我不知道要存储多少项目(例如要处理的大小的 3 倍 RGB/HSV,或者即使我只使用一个项目(灰度)也实现 4 项目结构(RGBA) ?)以便在需要时有效地更改颜色空间或对矩阵执行操作。由于这是要集成到计算机视觉库中,因此极有可能每帧至少发生一次。
我在这里要求高效,这与意见无关(或很少)。可能有几个好的答案,从中选择取决于意见,但这应该是我的决定。
什么是图像数据的 "best" 数据结构在很大程度上取决于您要对图像执行哪种操作,并且主要取决于您希望优化性能的操作。
通常 std::vector
个字节就足够了(对于整个图像,不是每一行的向量);矢量保证数据存储在连续的内存块中,这可能适合也可能不适合您的用例(即,如果您需要管理比扫描线更长的步幅,则不适合)。
如果您需要更细粒度地访问像素格式信息(即单一颜色分量),您可能希望使用自定义结构来表示像素。
此外,数据结构可能会更复杂,具体取决于您需要管理的图像类型。 IE。您是否仅限于一种或几种像素格式? 您是否仅限于 "packed" 个图像(1 个 "plane" 中的连续颜色分量)或者您是否还需要管理 "planar" 个图像(多个 "planes",每个颜色分量一个)?
您还可以在网上查看一些可用的图形库。
一个(在我看来)具有有趣的像素组件管理(带有自定义迭代器和其他工具)的是 Boost GIL