我有黑白图像,包括轮廓内未填充的轮廓。这些轮廓代表固体的边缘。我想检测固体(岛)和孔,而不是使用Matlab填充固体。
我尝试了一些方法。我可以检测出固体和孔洞。但是如果它们在另一个固体/孔内,我无法检测到它们。
F.e:最后我在以下链接中尝试了Amro答案中提到的方法: Fill area between two connected components in MATLAB
但它无法探测到洞内的固体岛。
另外:我能找到的所有例子都适用于检测背景上的固体并检测这些固体内部的孔。或者,如果背景上有多个对象(实体)或对象中有多个孔,如上所述的链接: Distinguish a simply connected figures?
但我正在尝试处理具有等级次序的未填充轮廓。
示例图片:
我想要的输出是:
编辑我的问题并添加我以前的作品以澄清
我只想检测图像中哪些区域必须填充为实体。 图像有很多轮廓。这些轮廓是固体和孔的边缘。与许多其他例子不同,我的图像在轮廓内有轮廓......
假设背景上有轮廓。这意味着它是一个坚实的,我们应该填补它。但是如果在第一个轮廓内部存在第二个轮廓,则意味着它是一个孔并且它必须保持未填充。如果在第二个内部有第三个,那又是一个固体,它必须被填充。就像那样......
到目前为止,我已经尝试了一种类似于@Huádéní华得尼写的方法(他的代码比我的代码更简单,更好,所以我不会写我的代码谈论他)。
在此方法中,我使用光栅扫描扫描像素。每次找到轮廓像素时,我都会在0和1之间改变状态。如果状态为0,我用0填充像素,如果是1则用1填充它们。
但是这个方法存在问题。在每个区域的上下水平边缘都有一些断线。
这是我使用相同方法的输出图像。它几乎和@Huádéní华得尼一样。
答案 0 :(得分:0)
如遍历每一行的简单解决方案怎么样?请参阅以下代码。它并不完美,需要处理持续的白线。如果我能解决,我会更新。
clc; clear all;
img = imread('g4K3N.png');
imgb = im2bw(img);
imgb2 = imgb;
for r = 1:size(img,1)
cc = 0;
p = 0;
for c = 2:size(img,2)
if (imgb(r,c)==imgb(r,c-1))
imgb2(r,c) = p;
continue;
else
cc = cc+1;
if (cc~=0 && mod(cc,2)==0)
p = ~p;
imgb2(r,c) = p;
end
end
end
end
imshow(imgb2);
输出: