Matlab:找到顶点集的内边界

时间:2015-03-18 12:49:33

标签: matlab draw vertices

我有一组以下列方式定义的(x,y)点:

    map=[0,0;66,0;66,44;44,44;44,66;110,66;110,110;0,110];

然后有一个函数将这些点(它们是顶点,即角点)连接在一起形成一个闭合的形状。我给出的示例顶点形成如下形状:

     ________________________________________
    |                                        |
    |                                        |
    |                                        |
    |                    ____________________|
    |                   |
    |                   |_______
    |                           |
    |                           |
    |                           |
    |                           |
    |___________________________|

我想现在自动生成第二组顶点,这些顶点在形状内部形成边界,偏移一定量。即这样:

    inner_boundary=[5,5;61,5;61,39;39,39;39,71;105,71;105,105;5,105];
     ________________________________________
    |   ___________________________________  |
    |  |                                   | |
    |  |              _____________________| |
    |  |             |   ____________________|
    |  |             |  |
    |  |             |  |_______
    |  |             |________  |
    |  |                      | |
    |  |                      | |
    |  |______________________| |
    |___________________________|

关于如何做到这一点的任何想法?我一直在绞尽脑汁,但却无法想出一个强有力的方法来做到这一点。我需要它来自动为任何输入顶点组执行此操作。另外,澄清一下 - 我只对如何指定顶点集而不是绘图部分感兴趣。

非常感谢!

1 个答案:

答案 0 :(得分:1)

这是一个基于图像处理工具箱功能的解决方案。基本思路如下:

  1. 使用" poly2mask"从多边形创建BW(0-1)图像 坐标
  2. 使用" imerode"以1像素侵蚀面具
  3. 使用" bwboundaries"追踪新的侵蚀边界
  4. 代码示例:

    x = [4 10 10 4 4];
    y = [4 4 10 10 4];
    mask = poly2mask(x,y,12,12);
    mask_eroded = imerode(mask, 1);
    newBnds = bwboundaries(mask_eroded);
    newBnds = newBnds{1};
    

    请注意,newBnds可能包含比您想要的更多的点,因为它会跟踪边界上的每个像素。您可以编写一个简单的迭代例程来丢弃非端点。