计算图像和多边形之间重叠的简单方法是什么?

sla*_*ton 7 matlab

我有一个封闭的非自相交多边形.它的顶点保存在两个向量X和Y中.最后,X和Y的值绑定在0到22之间.

我想构建一个大小为22x22的矩阵,如果多边形的一部分与该bin重叠,则设置每个bin的值等于true,否则为false.

我最初的想法是生成一个定义的点网格,[a, b] = meshgrid(1:22)然后inpolygon用于确定网格的哪些点在多边形中.

[a b] = meshgrid(1:22);
inPoly1 = inpolygon(a,b,X,Y);
Run Code Online (Sandbox Code Playgroud)

但是,如果bin的中心包含在多边形中,则它仅返回true,即它返回下图中的红色形状.然而,更需要绿色形状的线条(虽然它仍然是一个不完整的解决方案).

为了获得绿色blob,我执行了四次调用inpolygon.对于每次比较,我将NE,NW,SE或SW点的网格移动1/2.这相当于测试bin的角是否在多边形中.

inPoly2 = inpolygon(a-.5,b-.5,X,Y) | inpolygon(a+.5,b-.5,X,Y) | inpolygon(a-.5,b+5,X,Y) | inpolygon(a+.5,b+.5,X,Y);
Run Code Online (Sandbox Code Playgroud)

虽然这确实为我提供了部分解决方案,但是当一个顶点包含在一个bin但没有bin角落的情况下它会失败.

有没有更直接的方法来攻击这个问题,最好是一个产生更可读代码的解决方案?

在此输入图像描述

该图用以下绘制:

imagesc(inPoly1 + inPoly2); hold on;
line(a, b, 'w.');
line(X, Y, 'y); 
Run Code Online (Sandbox Code Playgroud)

klu*_*rie 5

一个建议是使用polybool功能(2008b或更早版本不提供).它找到两个多边形的交集并返回结果顶点(如果不存在顶点,则返回空向量).要在此处使用它,我们在网格检查中的所有方块上迭代(使用arrayfun)以查看polybool的输出参数是否为空(例如,不重叠).

N=22;
sqX = repmat([1:N]',1,N);
sqX = sqX(:);
sqY = repmat(1:N,N,1);
sqY = sqY(:);

intersects = arrayfun((@(xs,ys) ...
      (~isempty(polybool('intersection',X,Y,[xs-1 xs-1 xs xs],[ys-1 ys ys ys-1])))),...
      sqX,sqY);

intersects = reshape(intersects,22,22);
Run Code Online (Sandbox Code Playgroud)

这是结果图像:

在此输入图像描述

绘图代码:

imagesc(.5:1:N-.5,.5:1:N-.5,intersects');
hold on;
plot(X,Y,'w');
for x = 1:N
    plot([0 N],[x x],'-k');
    plot([x x],[0 N],'-k');
end
hold off;
Run Code Online (Sandbox Code Playgroud)