【发布时间】: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 v的struct rgba。为了访问pixel[x][y]的红色组件,请使用v[x*total_rows+y].red。尽管您将浪费 1 个字节用于 rgb 图像。否则为 rgb 图像创建单独的类,其中有vector<unsigned char>并存储数据,如您发布的那样。还要编写转换函数来将一种类型转换为另一种类型。
标签: c++ performance image-processing data-structures memory-efficient