首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个相连边界的形态分离

两个相连边界的形态分离
EN

Stack Overflow用户
提问于 2012-11-28 06:31:05
回答 2查看 1.2K关注 0票数 7

关于下面的场景,我有一个问题。当我对图像进行后处理时,我得到了一个轮廓,不幸的是,正如你在底线上看到的那样,它是两次连接的。为了让人明白,我想要的只是外围线。因此,我放大并标记了这条线,我想要大图像。

我想从这个选择中只需要外部的部分,我已经在下一张图片中标记为绿色。抱歉,我的绘画技术很差。;)

我正在使用IPT中的MatLab。因此,我也尝试使用bwmorphhbreak选项,但它抛出了一个错误。

我该如何解决这个问题?如果你成功了,你能告诉我更多关于它的信息吗?提前谢谢你!

由衷地

EN

回答 2

Stack Overflow用户

发布于 2012-12-20 02:26:43

似乎你的输入图像与你发布的图像有点不同,因为我不能直接收集分支点(有太多的分支点)。因此,为了开始处理你的问题,我考虑在分支点检测之后进行细化。我还将它们放大并从细化的图像中删除,这确保了在初始图像中的不同段之间实际上没有连接(4或8)。

代码语言:javascript
复制
f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0);
g = bwmorph(f, 'thin', 'Inf');
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate');

由于h保存断开连接的线段,因此以下操作将收集所有线段的端点:

代码语言:javascript
复制
u = bwmorph(h, 'endpoints');

现在,为了实际解决你的问题,我对你想要丢弃的东西做了一些快速分析。考虑h中的两个不同的网段:ab。我们说ab重叠,如果一个的端点包含在另一个中。所谓包含,只是指一个的起点x小于或等于另一个,而终点x也大于或等于。在您的情况下,“山”与您希望删除的线段重叠。要确定要删除的每一个,请考虑它们的面积。但是,由于这些是分段,面积是一个没有意义的术语。为了处理这一点,我连接了一个线段的端点,并简单地将其用作内部点的面积。你可以清楚地注意到,底部重叠部分的面积非常小,所以我们说它基本上是一条线,并丢弃了它,同时保留了“山”部分。要完成这一步,图像u至关重要,因为有了它,您就可以清楚地指示从哪里开始和停止跟踪轮廓。如果按原样使用图像h,您将很难确定从何处开始和停止采集等高线的点(即,光栅顺序将给出不正确的重叠指示)。

要将线段重建为单个线段(当前有三个线段),请考虑在h中从g中丢弃的点,并使用那些不属于现在删除的底部线段的点。

票数 2
EN

Stack Overflow用户

发布于 2012-11-28 09:31:10

我也会使用bwmorph

代码语言:javascript
复制
%# find the branch point
branchImg = bwmorph(img,'branchpoints');

%# grow the pixel to 3x3
branchImg = imdilate(branchImg,ones(3));

%# hide the branch point
noBranchImg = img & ~branchImg;

%# label the three lines
lblImg = bwlabel(noBranchImg);

%# in the original image, mask label #3
%# note that it may not always be #3 that you want to mask
finalImg = img;
finalImg(lblImg==3) = 0;

%# show the result
imshow(finalImg)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13594367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档