2015-11-17 109 views
2

我有黑白图像,包括轮廓内未填充的轮廓。这些轮廓代表了实体的边缘。我想检测固体(岛)和洞,而不是用Matlab填充固体。在Matlab中检测孔和实心图像,包括Matlab中的轮廓

我尝试了一些方法。我可以检测到固体和孔洞。但是如果它们位于另一个固体/孔内,我无法检测出固体和孔洞。

F.e:最后我尝试在以下链接荷银的回答中提到的方法: Fill area between two connected components in MATLAB

但它无法检测孔内部的固岛屿。

另外:所有我能找到的例子都能很好地检测背景中的固体并检测这些固体中的孔。或者有背景的多个对象(固体)或多于一个孔状中提到的链接的对象: Distinguish a simply connected figures?

但我想上具有分层顺序填充轮廓工作。

一个例子形象:

enter image description here

我想要的输出是:

enter image description here

编辑我的问题,将我以前的作品,以澄清

我只想做的就是检测whi我必须填写图像的ch区域作为实体。 图像有很多轮廓。这些轮廓是实体和孔的边缘。与许多其他示例不同,我的图像具有轮廓内的轮廓...

假设背景上有一个轮廓。这意味着它是一个坚实的,我们应该填补它。但是如果第一个轮廓内有第二个轮廓,这意味着它是一个洞,它必须保持不填充。如果第二个里面有第三个,那又是一个坚实的,它必须填补。这就像那样...

到目前为止,我已经尝试了一种类似于@Huádéní华得尼的方法(他的代码比我的简单,更好,所以我不写我的话在他的代码上)。

在这种方法中,我使用光栅扫描来扫描像素。每次找到一个轮廓像素我改变状态0和1之间。如果状态是0我用0填充像素,如果它是1我填充它们1.

但是这种方法存在问题。在每个区域的上部和下部水平边缘留有一些虚线。

这是我的输出图像使用相同的方法。它几乎与@Huádéní华得尼相同。

enter image description here

+0

@rayryeng,在链接你提到的例子更多的是找到固体或固体及其连接类型。但我甚至无法检测到洞内是否还有其他固体,或者是更多层次更多...... – furkan

+2

我明白了。那好吧,你并没有真正清楚自己。我会重新开放。这也有助于向我们展示您尝试过的内容,而不是向我们展示您所阅读的内容。此外,你想填写什么,你不想填写什么是模糊的。我仍然不明白如何从原始图像到填充的图像。如果我遇到了麻烦,那么任何自动算法都很可能会遇到麻烦。 – rayryeng

+1

@rayryeng <<如果我遇到了麻烦,那么任何自动算法都可能会有麻烦。>>,这是大多数人不理解的。 –

回答

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); 

输出:

enter image description here

+0

谢谢你的回答。我已经做了类似你的事情。但我有像你的照片那样的虚线。我编辑了我的问题的细节。 – furkan

+0

那么尝试一些图像处理技术来去除线条,如侵蚀和扩张。是的,正如@rayryeng之前所说的,这似乎很难实现。 –