我有黑白图像,包括未填充轮廓内的轮廓。这些轮廓代表固体的边缘。我想检测固体(岛屿)和孔比填补固体Matlab。
我尝试了一些方法。我能探测到固体和洞。但是,如果这些固体和孔是在另一个固体/孔内,我就无法探测它们。
最后,我尝试了Amro的答案中提到的方法,链接如下:Fill area between two connected components in MATLAB
但它无法探测到洞内的固体岛屿。
此外,:我能找到的所有例子都能很好地检测背景上的固体和探测这些固体内部的洞。或者如果背景上有多个物体(实心),或者像上面提到的链接那样的对象中有多个洞:Distinguish a simply connected figures?
但我正试着处理未填充的等高线,它有一个等级顺序。
一个示例图像:
我想要的输出是:
编辑我的问题并添加我以前的作品以澄清
我只想做的是检测图像的哪些区域,我必须填充为固体。这幅图像有许多轮廓。这些轮廓是固体和洞的边缘。不像其他的例子,我的图像在轮廓中有轮廓..。
假设背景上有一个等高线。这意味着它是一个固体,我们应该填补它。但是,如果在第一个轮廓的内部有第二个轮廓,这意味着它是一个洞,它必须保持未填充。如果在第二个里面有第三个,那又是一个固体,它必须被填充。这样的话..。
到目前为止,我已经尝试了一种与@Huání華得尼类似的方法(他的代码比我的更简单、更好,所以我不会写我的代码来讨论他的代码)。
在这种方法中,我用光栅扫描像素。每次找到等高线像素时,我都会在0到1之间改变状态。如果状态为0,我就用0填充像素,如果是1,就用1填充它们。
但是这种方法存在一个问题。在每个区域的上、下水平边缘都有一些折线。
下面是使用相同方法的输出图像。它几乎与@Huéní華得尼相同。
发布于 2015-11-17 20:08:03
一个简单的解决方案怎么样,比如遍历每一行。请参见下面的代码。它并不完美,需要处理连续的白线。如果我能解决的话我会更新的。
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);
输出:
https://stackoverflow.com/questions/33762467
复制相似问题