Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
探测孔及;Matlab环境下bw图像中包含轮廓的实体_Matlab_Image Processing_Contour_Fill - Fatal编程技术网

探测孔及;Matlab环境下bw图像中包含轮廓的实体

探测孔及;Matlab环境下bw图像中包含轮廓的实体,matlab,image-processing,contour,fill,Matlab,Image Processing,Contour,Fill,我有黑白图像,包括轮廓中未填充的轮廓。这些等高线表示实体的边。我想检测固体(岛屿)和孔洞,而不是使用Matlab填充固体 我试过一些方法。我可以探测固体和孔洞。但是,如果实体和孔位于另一个实体/孔的内部,我无法检测到它们 F.e:最后,我尝试了以下链接中Amro回答中提到的方法: 但它无法检测到孔内的固体岛 此外:我能找到的所有示例都适用于检测背景上的实体和这些实体内部的孔。或者,如果背景上有多个对象(实体)或对象中有多个孔,如所述链接: 但我正在尝试处理具有层次顺序的未填充轮廓 示例图像:

我有黑白图像,包括轮廓中未填充的轮廓。这些等高线表示实体的边。我想检测固体(岛屿)和孔洞,而不是使用Matlab填充固体

我试过一些方法。我可以探测固体和孔洞。但是,如果实体和孔位于另一个实体/孔的内部,我无法检测到它们

F.e:最后,我尝试了以下链接中Amro回答中提到的方法:

但它无法检测到孔内的固体岛

此外:我能找到的所有示例都适用于检测背景上的实体和这些实体内部的孔。或者,如果背景上有多个对象(实体)或对象中有多个孔,如所述链接:

但我正在尝试处理具有层次顺序的未填充轮廓

示例图像:

我想要的输出是:

编辑我的问题并添加我以前的作品以澄清问题

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

假设背景上有一个轮廓。这意味着它是固体,我们应该填充它。但如果第一个轮廓内有第二个轮廓,这意味着它是一个孔,必须保持未填充状态。如果第二个里面有第三个,那也是固体,必须填充。事情是这样的

到目前为止,我已经尝试了一种几乎类似于胡阿德尼的方法華得尼 编写(他的代码比我的更简单更好,所以我写我的代码不是为了谈论他的代码)

在这种方法中,我使用光栅扫描来扫描像素。每次查找轮廓像素时,我都会在0和1之间更改状态。如果状态是0,我用0填充像素,如果是1,我用1填充像素

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

这是我使用相同方法的输出图像。这和胡阿德尼几乎是一样的華得尼 .


一个简单的解决方案,比如遍历每一行,怎么样。请参阅下面的代码。它不是完美的,需要处理连续的白线。我会更新,如果我能解决它

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);
输出:


@rayryeng,您提到的链接中的示例更多地是关于查找实体及其连接类型。但我甚至无法检测孔内是否有另一个固体,或者层次更高……我明白了。好吧,那你没说清楚。我会重新开门的。这也将有助于向我们展示您的尝试,而不是向我们展示您所阅读的内容。此外,你想填写什么和不想填写什么是相当模糊的。我仍然不明白如何从原始图像转到填充图像。如果我有问题,那么任何自动算法都很可能有问题。@rayryeng@ParagS.Chandakkar我的朋友,你说得再好不过了。我不能对你的评论投赞成票,因为我已经没有票数了:S。。。但我明天会的!谢谢你的回答。我做过类似你的事。但我有像你的照片一样的断线。我已经编辑了我的问题的细节。那么试试一些图像处理技术来去除线条怎么样,比如腐蚀和扩张。是的,正如@rayryeng之前所说的,这似乎很难实现。