【发布时间】:2016-01-13 08:11:10
【问题描述】:
我想为彩色图像实现组件标签算法。
计算四个相邻像素与 (i,j) 处当前像素的颜色距离,算法进行如下:
如果没有一个邻居的颜色距离小于预定义的阈值 (T),则为像素 (i,j) 分配一个新标签。
如果只有一个邻居的颜色距离小于 T,则将其标签分配给像素 (i,j)。
-
(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