簡體   English   中英

哪種數據結構適合於在c ++中存儲鄰居像素距離?

[英]Which data structure would be appropriate to store neighbor pixel distance in c++?

我想為彩色圖像實現組件標簽算法。

計算在(i,j)處四個相鄰像素到當前像素的顏色距離,算法如下進行:

  1. 如果沒有鄰居的顏色距離小於預定義的閾值(T),則為像素(i,j)分配一個新標簽。

  2. 如果只有一個鄰居的顏色距離小於T,則將其標簽分配給像素(i,j)。

  3. (a)如果兩個或更多個鄰居的顏色距離小於T,則將(i,j)處的像素分配給具有最小顏色距離的像素。

    (b)色距最小的像素的標簽也分配給其他相鄰像素。

    (c)用具有最小色距的像素的標簽重新分配圖像中所有與其他相鄰像素具有相同標簽的先前標記的像素。

我想使用opencv庫在C ++中實現代碼。 我可以用來實現上述算法的最佳數據結構是什么? 我應該使用std :: map存儲鄰居距離值嗎?

另外,如果任何一個條件都滿足(1-3),則需要將該對應像素的標簽分配給當前像素(i,j)。 因此,我還需要知道它是哪個鄰居的標簽(即,左,上,左上對角線,右上對角線)。 我怎么得到的?

對於此用例,哈希表將很好地工作:

unordered_map<srcpixel,vector<pair<targetpixel,dist> > >

因此,每個srcpixel都將充當哈希表的鍵,並且該值將是一個向量,其中包含它與鄰居的距離。

這將很快,每個srcpixel的查找時間為O(1),然后對其鄰居進行線性遍歷。

為了存儲到每個像素的4個鄰居的顏色距離,您應該使用基於數組的數據結構,即std::vector ,純C數組甚至是opencv圖像,這是最方便使用的方法。 為了將一維圖像的像素值存儲在一維數組中,通常按行對數組進行索引,即,索引j * imageWidth + i用於尋址像素(i, j)

例如,使用std::vector ,您可以像下面這樣存儲到鄰居的距離的值:

std::vector<uint8_t> colorDistDown(imageWidth * (imageHeight-1));
for(int j = 0; j < imageHeight - 1; ++j) {
  for(int i = 0; i < imageWidth; ++i) {
    colorDistDown[j * imageWidth + i] = colorDistance(image, i,j, i,j+1);
  }
}

使用std::mapstd::unordered_map會慢得多。 但是,如果只想存儲圖像的較小(和非矩形)區域的條目,則使用map-datastructure可能有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM