【问题标题】:Find points within polygon with multiple self intersections with Matlab使用Matlab查找具有多个自相交的多边形内的点
【发布时间】:2017-09-02 14:27:46
【问题描述】:

我有一个与自身相交多次的多边形。我尝试从这个多边形创建一个蒙版,即找到多边形内的所有点/像素位置。为此,我使用 Matlab 函数 poly2mask。但是,由于有多个自相交,这是我得到的结果:

Resulting mask from poly2mask for multi-self-intersecting polygon

因此,由于交叉路口,某些区域仍未被遮盖。我认为 Matlab 将其视为某种夹杂物。 poly2mask 的 Matlab 帮助没有提到任何关于此的内容。有谁知道如何将这些区域也包含在掩码中?

【问题讨论】:

  • 你能提供一些示例数据吗?
  • 我正在考虑使用boundary,但我不确定它是否可行。

标签: matlab polygon mask


【解决方案1】:

您应该首先计算多边形的边界并使用它来创建您的蒙版。

k = boundary(x, y, 0.99); % 1 == tightest single-region boundary
BW = poly2mask(x(k), y(k), m, n)

使用 0.99 而不是 1 的收缩系数可避免底切,但仍无法正确拟合尖锐的非凸角。

【讨论】:

  • 感谢您的回答。不幸的是,对于我的数据集,即使是最严格的“收缩因子”也没有给出正确的外边界。否则这将是一个很好的解决方案。
  • 你能给我一个多边形样本,我可以测试一下吗?
  • 这是一个 zip 文件的链接,该文件包含一个带有多边形的 mat 文件:dropbox.com/s/0cpu8u18ke4j9gf/polygon_edge.zip?dl=0
【解决方案2】:

你可以使用inpolygon:

bw1 = poly2mask(x,y,1000,1000);
subplot(131)
imshow(bw1)
hold on
plot(x([1:end 1]),y([1:end 1]),'g','LineWidth',2)
title('using poly2mask')

[xq,yq] = meshgrid(1:1000);
[IN,ON] = inpolygon(xq,yq,x,y);
bw2 = IN | ON;
subplot(132)
imshow(bw2)
hold on
plot(x([1:end 1]),y([1:end 1]),'g','LineWidth',2)
title('using inpolygon')

% boundary - seggested by another answer
k = boundary(x, y, 1); % 1 == tightest single-region boundary
bw3 = poly2mask(x(k), y(k), 1000, 1000);
subplot(133)
imshow(bw3)
hold on
plot(x([1:end 1]),y([1:end 1]),'g','LineWidth',2)
title('using boundary')

更新 - 我更新了我的答案以包含 boundary - 在我的情况下似乎效果不佳。

【讨论】:

  • 感谢您的回答。不幸的是,对我来说,'inpolygon' 给出的结果与'poly2mask' 相同。另外,我宁愿避免使用多边形,因为它比 poly2mask 花费更多的时间,因为我拥有大量像素(1024x768)。 Poly2mask 利用了它们位于规则网格上的事实。使用“边界”功能,我和你有同样的问题,即使我将“收缩因子”设置得非常严格。
【解决方案3】:

结合一个小的腐蚀/膨胀步骤和imfill,我得到了很好的结果,如下所示:

data = load('polygon_edge.mat');
x = data.polygon_edge(:, 1);
y = data.polygon_edge(:, 2);

bw1 = poly2mask(x,y,ceil(max(y)),ceil(max(x)));
se = strel('sphere',1);
bw2 = imerode(imdilate(bw1,se), se);
bw3 = imfill(bw2, 'holes');
figure
imshow(bw3)
hold on
plot(x(:, 1),y(:, 1),'g','LineWidth',2)

需要小的腐蚀和膨胀步骤以确保所有区域即使在多边形仅通过单个点连接的地方也连接起来,否则imfill 可能会看到一些不存在的孔。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2013-10-16
    • 2017-04-20
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多