哪种数据结构适合在c ++中存储邻居像素距离?

时间:2015-10-15 02:37:05

标签: c++ opencv image-processing image-segmentation connected-components

我想为彩色图像实现组件标签算法。

计算四个邻居与(i,j)处当前像素的颜色距离,算法如下:

  1. 如果没有邻居的色彩距离小于预定义的阈值(T),请为像素(i,j)指定新标签。

  2. 如果只有一个邻居的色彩距离小于T,则将其标签指定给像素(i,j)。

  3. (a)如果两个或多个邻居的色彩距离小于T,则为(i,j)处的像素分配具有最小色距的标签。

    (b)具有最小色距的像素的标签也被分配给其他相邻像素。

    (c)图像中与其他相邻像素具有相同标签的所有先前标记的像素被重新分配具有最小色距的像素的标签。

  4. 我想使用opencv库在C ++中实现代码。我可以用来实现上述算法的最佳数据结构是什么?我应该使用std :: map来存储邻居距离值吗?

    此外,如果任何一个条件满足(1-3),我需要将该对应像素的标签分配给当前像素(i,j)。所以我还需要知道它是哪个邻居的标签(即左,上,左上对角线,右上对角线)。我怎么做到的?

2 个答案:

答案 0 :(得分:0)

哈希表适用于此用例:

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

因此,每个srcpixel都将作为哈希表的一个键,该值将是一个包含它与其邻居的距离的向量。

这将是每个srcpixel的快速,O(1)查找时间,然后是它的邻居的线性遍历。

答案 1 :(得分:0)

要将颜色距离存储到每个像素的4个邻居,您应该使用基于数组的数据结构,即std::vector,普通C数组或甚至是opencv-image,这对您来说最方便使用。 为了在一维数组中存储图像像素的值,该数组通常按行索引,即索引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会慢得多。但是,如果您只想存储图像的小(和非矩形)区域的条目,则使用地图数据结构可能有意义。