我有一个多边相交的多边形。我尝试从这个多边形创建一个蒙版,即找到多边形内的所有点/像素位置。我使用Matlab函数poly2mask。但是,由于多次自交,这是我得到的结果:
Resulting mask from poly2mask for multi-self-intersecting polygon
因此,由于交叉点,一些区域仍然未被掩盖。我认为Matlab认为这是某种内容。 poly2mask的Matlab帮助没有提到任何关于这一点。有没有人知道如何在面具中包含这些区域?
答案 0 :(得分:0)
首先应计算多边形的边界,然后使用它来创建蒙版。
k = boundary(x, y, 0.99); % 1 == tightest single-region boundary
BW = poly2mask(x(k), y(k), m, n)
使用0.99而不是1的收缩系数可以避免底切,但是仍然无法正确安装尖锐的非凸角。
答案 1 :(得分:0)
您可以使用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
- 在我的案例中似乎不太适用。
答案 2 :(得分:0)
我结合小的侵蚀/扩张步骤和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
可能会看到一些不存在的孔。