合并具有不同标签的相邻连接组件

时间:2018-12-27 22:38:18

标签: matlab image-processing computer-vision

请考虑以下图片:

enter image description here

在左侧,假设我有3个标签。背景= 1,黑色= 2,橙色=3。我想要做的是能够首先识别所有连接的橙色组件,然后如果有黑色的物体碰到橙色,那么我想进行转换这个也要橙色。

我知道以下步骤:

  1. 假设标记的图像称为labeled。我orange = labeled == 3
  2. CC = bwconncomp(orange);

但是从这里开始,我不确定如何检查黑色部分是否接触到橙色。一旦知道哪些黑色组件正在碰到橙色,就可以执行以下操作:RP = regionprops(black, 'PixelIdxList'); labeled(RP(index).PixelIdxList) = 3;

要测试代码:这是输入和输出生成的示例:

%input matrix
I = zeros([8 8]);
I(1:5, 1:5) = 1;
I(2:4, 3:7) = 2;
I(7:8, 1:2) = 1;
I(7:8, 7:8) = 2;
I

%output
O = zeros([8 8]);
O(1:5, 1:5) = 1;
O(2:4, 3:7) = 1;
O(7:8, 1:2) = 1;
O(7:8, 7:8) = 2;
O

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作。让target表示目标值,对应于橙色。

  1. 使用allows for some app-specific configuration来确定定义为连接组件的区域,而无需考虑颜色。
  2. 对于每个区域,如果它至少包含一个等于target的像素,请将整个区域设置为target
target = 1; % value corresponding to orange
O = I;
[regions, numRegions] = bwlabel(I);
for regionId = 1:numRegions
    ind = regions==regionId;
    if any(I(ind)==target)
        O(ind) = target;
    end
end

答案 1 :(得分:1)

使用imreconstruct可以很简单地解决。对于二进制(逻辑)输入,此功能进行洪水填充。这个想法是找到一个遮罩图像(橙色和黑色区域在一起)和标记(或种子)图像(橙色区域)。

作为演示,让我们从OP已有的内容开始:

orig = readim('https://i.stack.imgur.com/rH7yT.png');
labeled = uint8(round((255-orig{2}(0:866,:))/127));
orange = labeled==1;  % for OP this is 3
black = labeled==2;   % for OP this is 2 also

(请注意,labeled与OP的不相同,每个标签的编号不同。)

现在我们可以应用imreconstruct

black_or_orange = orange | black;
output = imreconstruct(orange,black_or_orange);

output现在包含橙色区域,该区域已成长为涵盖任何触摸的黑色区域。我们可以创建一个新的标签图像,如下所示:

new_labeled = uint8(output) + 2*uint8(black & ~output);

figure generated by the code above