什么是表示图像矩阵的理想数据结构?

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