【问题标题】:Merging neighboring connected components with different labels合并具有不同标签的相邻连接组件
【发布时间】:2019-05-25 20:52:33
【问题描述】:

考虑下图:

在左侧,假设我有 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

【问题讨论】:

    标签: matlab image-processing computer-vision


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      您可以按以下方式进行。让target表示目标值,对应橙色。

      1. 使用bwlabel 识别定义为连接组件的区域,而不考虑颜色。
      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
      

      【讨论】:

        猜你喜欢
        • 2013-12-02
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2021-06-15
        • 2011-08-18
        相关资源
        最近更新 更多