【问题标题】:What would be an ideal data structure to represent an image matrix? [closed]什么是表示图像矩阵的理想数据结构? [关闭]
【发布时间】:2017-04-03 11:42:14
【问题描述】:

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

有人告诉我,做一个 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

或者是否可以更有效地执行此操作(例如使用 long int 或 float 将所有通道的值保存到一个变量中),如果可以,如何?我怎样才能使这个通用处理 1、2、3 或 4 个通道,以便我可以(相对)轻松地更改色彩空间?

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

编辑:由于这个问题已被标记为主要基于意见,我会尽量让它更清楚。

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

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

【问题讨论】:

  • std::vector 保证数据连续存储在内存中。
  • 什么是“最好的”?有很多方法,它们都有自己的优点和缺点。我建议你看看各种开源图像处理库,看看他们是如何做到的。您可能还想问问自己重新发明轮子是否有意义。
  • 为什么不只使用一个包含 9.000.000 个元素的向量?
  • 交错格式处理起来很烦人,所以如果交错没有特别的原因,我会避免它。
  • 您可以使用 vector vstruct rgba 。为了访问pixel[x][y] 的红色组件,请使用v[x*total_rows+y].red。尽管您将浪费 1 个字节用于 rgb 图像。否则为 rgb 图像创建单独的类,其中有 vector<unsigned char> 并存储数据,如您发布的那样。还要编写转换函数来将一种类型转换为另一种类型。

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


【解决方案1】:

图像数据的“最佳”数据结构在很大程度上取决于您想要对图像执行什么样的操作,并且主要取决于您想要优化性能的操作。

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

如果您需要更细粒度地访问像素格式信息(即单一颜色分量),您可能希望使用自定义定义的结构来表示像素。

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

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

【讨论】:

  • 好答案。 This 是一个很好的起点。
  • 这个问题实际上可能不清楚,我不应该从字面上问“数据结构”,而是它的内容。当我对使用什么有疑问时,我总是考虑@erip 提供的图片,尽管在这里我很确定没有更好的选择(std::array 不会很好,因为在编译时显然不知道大小,我非常怀疑其他的是否可以方便地存储必须随时访问和修改的像素)。结构会很棒,但正如我所问的那样,改变色彩空间存在问题,这正是问题所在!
  • 赞成提供 GIL 的链接。我完全不知道这个,我会详细阅读它,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2010-11-26
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
相关资源
最近更新 更多