在我最近阅读MATLAB Answers上的一些图像处理问题时,我遇到了几个涉及二值图像对象和多边形边界的问题,就像这样。
问题各不相同,但都很相似:
- 我如何确定哪些对象接触多边形边界?
- 我怎样才能摆脱边界外的物体?
- 如何去除边界外或触及边界的物体?
- 如何在边界的一定距离内去除物体?
今天我想向你展示如何回答所有这些问题,除此之外,使用这些基本操作:
(或者,作为一种替代
drawpolygon
,
images.roi.Polygon
,
createMask
,你可以使用
roipoly
而且
poly2mask
.)
这是我今天要用的图片:
image_url =“https://blogs.mathworks.com/steve/files/rice - bw - 1. - png”;
这是我的多边形。
我将用辅助函数来画它,
showpoly
,这篇文章的最后。helper函数使用
drawpolygon
,像这样:
p = drawpolygon(Position = xy, FaceAlpha = 0.5)
p =
带有属性的多边形:位置:[6×2 double]标签:"颜色:[0 0.4470 0.7410]父层:[1×1坐标轴]可见:开启已选:0显示所有属性
请注意,
drawpolygon
创建一个
images.roi.Polygon
(或只是
多边形
).的
多边形
对象是其中的一种
的(ROI)对象
在图像处理工具箱中。您可以自定义其外观和行为的许多方面,它对于实现与roi一起工作的应用程序非常有用。
今天的主题特别有趣的是
多边形
函数
createMask
.此函数返回多边形内带有白色像素的二值图像。
对象完全或部分位于多边形内
现在我们可以开始回答物体多边形的问题了。首先:哪些对象在多边形内部,全部或部分?
MATLAB图像处理的有趣之处在于对二值图像使用逻辑运算符。下面,我用多边形掩码图像计算原始二值图像的逻辑与。
接下来,我应用形态重建使用
imreconstruct
.此函数接受一个
标志形象
并向外展开对象,同时限制展开只包括第二个输入中的对象像素。这是一种将部分对象转换回完整的原始形状的方便方法。结果,
C
,是包含完全或部分位于多边形内的对象的图像。
接触多边形周长的对象
下一个问题:哪些物体接触到多边形的边缘或周长?我将从
bwperim
在多边形蒙版上计算周长蒙版。
Perimeter_mask = bwperim(mask);
回到逻辑上
&
运算符给出了任何物体的周长像素。
形态重建在这里也很有用,可以从位于多边形周长上的对象像素“重建”对象的完整形状。
多边形外的对象
第三个问题:哪些物体存在
完全
在多边形外?回想一下那个图像
C
,上面计算的是完全或部分在多边形内的对象。我们想要的对象,就是在里面的对象
一个
但不是在
C
.你可以用
A & c
或
setdiff (A, C)
.
objects_outside = A & ~C;
那么靠近右上角多边形顶点的物体呢?它真的完全在多边形外吗?
它看起来像一条白色的条在多边形内部。为什么呢?
我将通过显示多边形蒙版、外部对象、多边形本身和像素网格来解释。我将使用
imshowpair
多边形蒙版和外部对象蒙版。(函数
pixelgrid
在
文件交换
.)
imshowpair (objects_outside,面膜)
当多边形仅部分覆盖像素时,
createMask
具有特定的绑定打破规则,以确定像素是在内部还是外部。你可以在上面的几个像素中看到打破平局的规则。
在多边形边界内且距离至少20个像素的对象
第四个问题是哪些对象不仅在多边形内部,而且距离多边形边界至少有20个像素?为了回答这个问题,我将引入另一个工具:
距离变换,
计算结果为
bwdist
.
首先,让我们从应用逻辑NOT(或补)操作符开始,
~
.将它应用到多边形蒙版图像上,我们得到了一个显示多边形外像素的蒙版。我将打开轴盒,这样你就可以看到外部蒙版的范围。
对于每个图像像素,距离变换计算该像素与最近的前景像素之间的距离。如果一个像素本身是前景像素,那么该像素处的距离变换为0。通过计算外部蒙版的距离变换,我们可以找出每个像素到多边形外部中最近的像素的距离。
G = bwdist(exterior_mask);
的自动变换语法将距离变换显示为图像时
imshow
是有用的。只是指定
[]
作为显示强度值时的第二个参数,最小值将自动缩放为黑色,最大值将自动缩放为白色。
现在让我们用一个关系运算符计算一个距离外部掩码至少20个像素单位的像素掩码,
> =
.
internor_mask_with_buffer = (G >= 20);
imshow (interior_mask_with_buffer)
使用上面描述的技术,计算一个包含完全在内部缓冲蒙版之外的对象的图像。
H = imrebuild (A & ~interior_mask_with_buffer, A);
接下来,找到在中的对象
一个
但不是在
H
.
interior_mask_with_buffer imshowpair(我)
不在多边形边界20像素范围内的对象
今天的最后一个问题是哪些对象不在多边形边界的20个像素内。首先计算周长掩码的距离变换。
J = bwdist(perimeter_mask);
使用关系运算符计算缓冲的周长掩码。
perimeter_mask_with_buffer (J <= 20);
imshow (perimeter_mask_with_buffer)
使用上面描述的技术来查找完全或部分位于缓冲周长掩码区域内的所有对象。
K = A & perimeter_mask_with_buffer;
最后的答案是原始图像中的物体,
一个
,但不在
l
.
perimeter_mask_with_buffer imshowpair (M)
这篇文章展示了一些MATLAB和工具箱函数和运算符,它们很好地协同工作:
- createMask(或poly2mask)从多边形中创建一个二进制的“掩码”图像
- 二值图像上的逻辑运算符来计算诸如"在这个图像或掩码中,而不是在另一个中"
- imreconstruct从二值图像的局部图像重建原始图像形状
- bwdist来计算距离变换,它告诉你每个图像像素距离某个二值图像掩码的距离
- 从距离变换图像形成掩码的关系运算符
祝你玩得开心。
新年快乐!
drawpolygon(Position = xy, FaceAlpha = 0.5);
댓글
댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。