像素与多边形重叠:高效(扫描线型)算法

时间:2012-12-10 18:57:25

标签: graphics geometry polygon computational-geometry scanline

问题规范: 我有一个矩形和均匀间隔的像素图像,顶点坐标为(i,j),(i + 1,j),(i,j + 1),(i + 1,j + 1)[i = 0,... ..,M-1; j = 0,...,n-1]和具有顶点坐标(x_1,y_1),...,(x_n,y_n)的多边形P.现在我想有效地计算与P重叠的每个像素的百分比.P可以是非凸的,甚至是自相交的。

基本上,这是扫描线光栅化算法的“软”推广,如果像素中心位于多边形内部/外部,则可以有效地检查。

我可以想到以下方法:

(1)对图像进行采样(例如,通过因子10 * 10),计算多边形内有多少个子像素中心,并除以100.问题:时间效率,记忆效率,准确度。

(2)在较大的(0.5,0.5)平移网格上使用扫描线算法计算完全位于内部/外部的像素,创建“边界”像素列表,沿逆时针方向行走边缘并计算沿途所有像素的交叉区域。问题:需要细微的编码,容易引入错误。

我的问题:有没有人已经遇到过这个问题,你知道第三种更好的方法吗?如果没有,你有(1)或(2)更好的经历吗?我假设在抗锯齿的情况下可能会出现这个问题吗?

2 个答案:

答案 0 :(得分:3)

进行精确的几何分析可能不会太困难。

首先处理多边形部分覆盖的像素:您可以使用technique from ray-tracing快速查找与多边形边相交的所有像素。然后,您可以使用Cohen-Sutherland算法有效地找到边和像素之间的交点,因此您可以计算该像素的覆盖区域。

请注意,您可以避免Cohen-Sutherland中涉及的两个裁剪操作之一,因为相邻像素将共享一个分段交叉点。例如 - 如果您有两个相邻像素,AB与点p->qa1a2处的细分b1相交和b2,然后a2b1将是相同的。 <{1}}时,将a2->q段传递到例程中可以避免重复工作。

你必须特别处理包含多边形顶点的像素,但同样不应该太棘手:Cohen-Sutherland也会在这里提供帮助。

自相交多边形也会抛出一些特殊情况来处理 - 与两条或更多条边相交的像素。我可以很容易地想象,在所有情况下处理这些都可能会变得棘手,所以我很想在这里进行上采样方法。

识别出这些边缘像素后,您可以使用标准扫描线来填充多边形的内部像素。

编辑:实际上,现在我想更多关于它,你可以完全跳过Cohen-Sutherland的一步。可以容易地扩展链接纸中的算法以返回段和像素网格之间的交叉点。该段将在B处留下给定像素。跟踪最后一个出口点,重新用作下一个像素的入口点。

答案 1 :(得分:0)

我愿意

1a)当像素部分重叠时的上传:

但不是整个图像,只有当前要检查的像素,或当前扫描行中的所有像素(如果有帮助)。

比没有内存参数。

速度?高达16x16我不认为速度是一个问题。