【问题标题】:Which data structure would be appropriate to store neighbor pixel distance in c++?哪种数据结构适合在 C++ 中存储相邻像素距离?
【发布时间】:2016-01-13 08:11:10
【问题描述】:

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

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

【问题讨论】:

  • 您可以只使用一个 Mat(整数,Mat1i)来存储标签值。您不需要地图或哈希表
  • 我知道 Mat 可以用来存储标签值。我的问题不是那个!我问我可以使用什么数据结构来存储邻居距离并进行比较。
  • 您也可以将距离值存储在 Mat 中。如果你有 8 个邻居,你可以制作一个 8 通道的浮动垫。但是您的算法似乎对图像进行了一次扫描以设置标签,并进行了第二次扫描以解决标签等价问题,我完全不明白您为什么需要存储距离。只需动态计算每个像素并相应地设置标签。可能至少一些伪代码会比编号列表提供更多信息

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


【解决方案1】:

要存储到每个像素的 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 会慢得多。但是,如果您只想存储图像的小(和非矩形)区域的条目,则使用地图数据结构可能是有意义的。

【讨论】:

  • colorDistDown(imageWidth * (imageHeight-1)) 为什么需要这个大小的向量?我需要在光栅扫描中计算当前像素 (i,j) 的 4 个邻居的距离。此外,如果任何一个条件满足(1-3),我需要将相应像素的标签分配给当前像素(i,j)。所以我还需要知道它是哪个邻居的标签(即左、上、左上对角线、右上对角线)。我怎么得到它?
【解决方案2】:

哈希表很适合这个用例:

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

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

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

【讨论】:

  • 你的意思是 srcpixel = 当前像素 (i,j) ?如何与存储在此 vector> 中的相邻距离进行比较?请你帮忙,因为我不太熟悉 C++。
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多