0

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

有人告诉我,做一个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 ::向量的话),但内容本身。

编辑:既然这个问题已经被标记为主要意见为基础的,我会尽量做到清晰。

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

我要求的东西高效在我这里的情况下,这与意见没有任何关系(或很少)。可以有几个很好的答案,其中选择依赖于意见,但这应该是我的呼吁。

+2

'的std :: VECTOR'保证数据连续存储在内存中。 –

+0

什么是“最佳”?有很多方法,他们都有自己的优点和缺点。我建议你看看各种开源图像处理库,看看它们是如何做到的。你也可能想问自己是否有意义重新发明车轮。 – Piglet

+0

@JesperJuhl对于一个矢量,确实不是数千。在一个3000x3000像素的图像中,会有3001个矢量,并不是所有的矢量都会被连续存储。 – Razakhel

回答

2

什么是图像数据的“最佳”数据结构高度取决于您希望在图像上执行什么样的操作,主要取决于您希望哪些操作具有优化的性能。

一般字节std::vector可以足够(对于整个图像,而不是针对每个单个线的向量);矢量保证数据存储在连续的内存块中,这可能会或可能不适合您的使用情况(即,如果您需要管理比扫描线更长的步幅,则不会)。

如果需要的像素格式的信息(即单一颜色成分)更细粒度的访问,则可能需要使用一个自定义的结构,用于像素表示。

此外,数据结构可以根据哪一种你需要管理的图像更加复杂。 也就是说你仅限于1个或几个像素格式? 是否仅限于“打包”图像(1“平面中的顺序颜色分量”),还是您还需要管理“平面”图像(多个“平面”,每个颜色分量一个)?

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

+0

很好的答案。 [This](http://homepages.e3.net.nz/~djm/containerchoice.png)是一个很好的起点。 – erip

+0

这个问题实际上可能不清楚,我不应该直接询问“数据结构”,而是询问其内容。我总是会考虑提供的图片,当我怀疑使用什么时,我确信没有更好的选择了(std :: array不会很好,因为在编译时显然不知道大小,并且我非常怀疑其他方法可以方便地存储必须随时访问和修改的像素)。一个结构会很好,但是正如我问到的那样,改变色彩空间的问题,这正是问题所在! – Razakhel

+0

Upvoted提供GIL的链接。我绝对不知道这件事,我会详细阅读,谢谢! – Razakhel