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

时间:2017-04-03 11:42:15

标签: c++ performance image-processing data-structures memory-efficient

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

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

问题是,矢量的内容必须与颜色空间有关。另外,对于大小问题,每个通道最好有一个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>中。这里的问题是我不知道要存储多少项(例如,处理RGB / HSV的大小是3倍,或者实现4项结构(RGBA),即使我只使用一个(灰度)?)以便在需要时有效地更改颜色空间或对矩阵执行操作。由于这意味着要集成到计算机视觉库中,因此每帧至少发生一次极有可能

我在这里要求的是一些高效的东西,它与意见没什么关系(或很少)。可能有几个好的答案,其中的选择依赖于意见,但这应该是我的呼吁。

1 个答案:

答案 0 :(得分:2)

图像数据的“最佳”数据结构在很大程度上取决于您要对图像执行的操作类型,主要取决于您希望优化性能的操作。

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

如果您需要更精细地访问pixelformat信息(即单色组件),您可能需要使用自定义结构进行像素表示。

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

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