史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

对象和多边形边界

最近我的一些熟读在MATLAB图像处理问题的答案,我遇到过几个问题,包括二进制图像对象和多边形边界,像这样。
binary-objects-polygonal-boundaries.png
问题不同但都是类似的:
  • 我怎么能确定哪些对象多边形边界联系?
  • 我怎样才能摆脱物体外边界?
  • 我怎样才能摆脱对象外或接触边界?
  • 我怎样才能摆脱对象在一定边界的距离?
今天,我想向您展示如何回答所有这些以及更多的问题之外,使用这些基本操作:
(或者,作为替代 drawpolygon , images.roi.Polygon , createMask ,你可以使用 roipoly poly2mask 。)
这是我今天将使用的图像:
image_url =“https://blogs.mathworks.com/steve/files/rice - bw - 1. - png”;
一个= imread (image_url);
imshow (A)
这是我的多边形。
xy = [
118年31日
35 116
35 219
219 245
161 186
237年56];
我将画它使用一个helper函数, showpoly ,这是这篇文章的最后。辅助函数使用 drawpolygon 像这样:
imshow (A)
p = drawpolygon(位置= xy, FaceAlpha = 0.5)
p =
多边形的属性:位置:(6×2双)标签:“颜色:父:[0 0.4470 - 0.7410][1×1轴]可见:在选择:0显示所有属性
请注意, drawpolygon 创建一个 images.roi.Polygon (或只是 多边形 )。的 多边形 对象是各种各样的 (ROI)对象 图像处理工具箱。您可以自定义它的外观和行为的许多方面,它是有用的实现应用程序与roi。
今天的话题特别感兴趣的是 多边形 函数 createMask 。这个函数返回一个二进制图像与白色像素内多边形。
掩码= createMask (p);
imshow(面具)

在多边形对象完全或部分

现在我们可以开始回答object-polygon问题。首先:哪些对象在多边形内部,完全或者部分吗?
的一件事使得图像处理是使用MATLAB的乐趣与二进制图像逻辑运算符。下面,我计算逻辑与原始二进制图像的多边形面具的形象。
B = &面具;
imshow (B)
showpoly
接下来,我应用形态学重建 imreconstruct 。这个函数接受一个 标志形象 和向外扩张其对象,而限制扩大到包括只在第二个输入对象像素。这是一个方便的方式将部分对象回它们的完整,原始形状。结果, C ,是一个图像包含的对象是完全或部分在多边形内。
C = imreconstruct (B);
imshow (C)
showpoly

物体触摸多边形的周长

下一个问题:哪些对象接触的边缘,或周边,多边形?我将从 bwperim 在多边形的面具来计算周长的面具。
perimeter_mask = bwperim(面具);
imshow (perimeter_mask)
回到逻辑 & 运营商给我们周边像素的任何对象的一部分。
D = & perimeter_mask;
imshow (D)
再次形态学重建是有用的在这里,“重建”的完整形状对象的对象像素,沿多边形的周长。
J = imreconstruct (D);
imshow (J)
showpoly ();

对象在多边形外

第三个问题:哪些对象谎言 完全 在多边形外?回想一下,图片 C 上面的计算,在多边形对象完全或部分。我们想要的对象,对象的 一个 但不是在 C 。你可以计算使用 C & ~ setdiff (A, C)
objects_outside = & ~ C;
imshow (objects_outside)
showpoly ();
右上角的多边形顶点附近的对象呢?真的是完全在多边形外?
轴([45 60 215 230])
它看起来就像一片白色是多边形内。这是为什么呢?
我将解释通过显示多边形面具,外部对象,多边形本身,像素网格。我将使用 imshowpair 多边形面具和外物的面具。(函数 pixelgrid 文件交换 。)
imshowpair (objects_outside,面膜)
showpoly ();
轴([45 60 215 230])
pixelgrid
当一个多边形只是部分包括一个像素, createMask 有一定的打破僵局的规则来确定一个像素是否内部或外部。你可以看到关键规则在上面几个像素。

对象内部和至少20像素的多边形边界

第四个问题是哪些对象不仅在多边形内,但至少20像素从多边形边界?要回答这个问题,我将在另一个工具: 距离变换, 所计算的 bwdist
首先,让我们开始通过应用逻辑不(或补充)操作符, ~ 。将它应用到多边形面具图片给了我们一个面具显示的像素在多边形外。我会把轴框,这样你就可以看到外表面具的程度。
exterior_mask = ~面具;
imshow (exterior_mask)
距离变换计算,对于每一个图像的像素,像素之间的距离,最近的前景像素。如果一个像素本身就是一个前景像素,像素的距离变换在0。通过计算的距离变换外表面具,我们可以找出每个像素有多远从最近的像素在多边形外。
G = bwdist (exterior_mask);
(替代方法:考虑的缓冲方法 polyshape 对象)。
当显示距离变换形象,自变换量程的语法 imshow 是有用的。只是指定 [] 作为第二个参数时显示强度值和最小值会自动缩放到黑色,和最大强度值会自动扩展为白色。
imshow (G, [])
现在让我们计算一个像素的面具至少20像素单位远离外部面具通过使用一个关系运算符, > =
interior_mask_with_buffer = (G > = 20);
imshow (interior_mask_with_buffer)
showpoly ();
使用上面描述的技术,计算一幅图像包含的对象完全内部缓冲罩外。
H = imreconstruct(一个& ~ interior_mask_with_buffer);
imshow (H)
接下来,找到对象 一个 但不是在 H
我= & ~ H;
interior_mask_with_buffer imshowpair(我)
showpoly ();

对象不是在20像素的多边形边界

今天的最后一个问题是哪些对象不是在20像素的多边形边界。首先计算周长的距离变换面具。
J = bwdist (perimeter_mask);
imshow (J [])
使用关系操作符来计算一个缓冲周长面具。
perimeter_mask_with_buffer = (J < = 20);
imshow (perimeter_mask_with_buffer)
使用上面描述的技术来查找所有的对象都是当今在缓冲面具周边地区或部分。
K = & perimeter_mask_with_buffer;
L = imreconstruct (K);
imshow(左)
最后的答案是原始图像中的对象, 一个 ,但不是 l
M = & ~ L;
perimeter_mask_with_buffer imshowpair (M)
showpoly ();
这篇文章展示了MATLAB和工具箱函数和运算符一起工作得很好:
  • createMask(或poly2mask)来创建一个二进制从多边形“面具”的形象
  • 逻辑运算符在二进制图像计算诸如“在这个图像或面具而不是另一个“
  • imreconstruct重建原始二进制图像从部分的形状
  • bwdist计算距离变换,它告诉你有多远从一些二进制图像掩模图像像素
  • 关系运算符形式面具从距离变换的图像
玩得开心。
和新年快乐!
函数showpoly
% Helper函数
xy = [
118年31日
35 116
35 219
219 245
161 186
237年56];
drawpolygon(位置= xy, FaceAlpha = 0.5);
结束
|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。