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