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



当我在做计算机视觉库时,我想知道保存图像数据的理想数据结构是什么。

有人告诉我,做一个std::vector的浸泡是非常糟糕的,因为不能保证数据连续性,所以一个简单的更有效。

问题是,矢量的内容必须依赖于色彩空间。另外,对于大小问题,最好每个通道都有一个无符号的字符,尽管我最好有浮点数来执行操作。

为了处理色彩空间,我是否应该增加矢量的大小(例如将其增加三倍以处理 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

或者是否可以更有效地做到这一点(例如使用长整型或浮点数将所有通道的值保留到一个变量中),如果是这样,如何?我怎样才能使这个通用处理 1、2、3 或 4 个通道,以便我可以轻松地(相对)更改色彩空间?

问题不在于容器(我已经使用了单个 std::vector),而在于内容本身。

编辑:由于这个问题已被标记为主要基于意见,我将尝试使其更清楚。

目前,我正在将图像的数据存储在std::vector<float>中。这里的问题是我不知道要存储多少项目(例如,处理 RGB/HSV 的大小是其 3 倍,或者即使我只使用一个(灰度)也实现 4 项结构 (RGBA)?)以便在需要时有效地更改色彩空间或对矩阵执行操作。由于这是要集成到计算机视觉库中的,因此很可能每帧至少发生一次。

我在这里要求一些有效的东西,这与意见无关(或很少)。可能有几个好的答案,其中的选择取决于意见,但这应该是我的决定。

图像数据的"最佳"数据结构是什么,很大程度上取决于您要对图像执行哪种操作,并且主要取决于您希望哪些操作具有优化的性能。

通常std::vector字节就足够了(对于整个图像,而不是每行的向量);向量保证数据存储在连续的内存块中,这可能适合也可能不适合您的用例(即,如果您需要管理比扫描线更长的步幅,则不需要)。

如果需要更细粒度地访问像素格式信息(即单色分量),则可能需要使用自定义结构进行像素表示。

此外,数据结构可能会更复杂,具体取决于您需要管理的图像类型。 即您仅限于 1 个或几个像素格式吗? 您是仅限于"打包"图像(1 个"平面"中的连续颜色分量),还是还需要管理"平面"图像(多个"平面",每个颜色分量一个)?

您还可以在 Web 上查看一些可用的图形库。
一个(在我看来)有一个有趣的像素组件管理(使用自定义迭代器和其他工具)是 Boost GIL

最新更新