0

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

计算四个相邻像素与 (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)。所以我还需要知道它是哪个邻居的标签(即左、上、左上对角线、右上对角线)。我怎么得到它?

4

2 回答 2

0

哈希表适用于这个用例:

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

因此,每个 srcpixel 将充当哈希表的键,而值将是一个向量,其中包含它与邻居的距离。

这会很快,每个 srcpixel 的查找时间为 O(1),然后对其邻居进行线性遍历。

于 2015-10-15T06:38:06.530 回答
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::maporstd::unordered_map会慢得多。但是,如果您只想存储图像的小(和非矩形)区域的条目,则使用地图数据结构可能是有意义的。

于 2015-10-15T08:02:43.840 回答