请考虑以下图片:
在左侧,假设我有3个标签。背景= 1,黑色= 2,橙色=3。我想要做的是能够首先识别所有连接的橙色组件,然后如果有黑色的物体碰到橙色,那么我想进行转换这个也要橙色。
我知道以下步骤:
labeled
。我orange = labeled == 3
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
答案 0 :(得分:1)
您可以执行以下操作。让target
表示目标值,对应于橙色。
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);