cv2.fillPoly奇怪的结果

3
尝试使用cv2.fillPoly将简单的多边形转化为光栅图时,我得到了奇怪的结果——非零像素的总数是10201,但应该是100*100。
pts = np.array([[0, 0], [100, 0], [100, 100], [0, 100], [0, 0]])
img = np.zeros((256, 256))
vertices = np.array([pts], dtype=np.int32)
mask = cv2.fillPoly(img, vertices, color=255)
print('np.count_nonzero(mask)', np.count_nonzero(mask))

出了什么问题?


1
Off-by one错误--应该是101 * 101(它确实是),因为您在第100列和第100行有一个边缘。想象一下小规模([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]),那是4条线,覆盖了4个像素(没有填充)。 - Dan Mašek
1
@DanMašek 哦,是的。 - mrgloom
我制作了一些像素艺术来为其他人说明,但如果您删除问题,我完全理解;)(这种情况经常发生) - Dan Mašek
1个回答

3
你犯了一个简单的偏移错误 -- 应该是101 * 101(等于10201)。
为了说明原因,我们将问题缩小,并运行以下点集的算法:
[[0, 0], [2, 0], [2, 2], [0, 2], [0, 0]]

并在以下网格上说明进展:

使用这些顶点调用 cv2.fillPoly (概念上) 可以执行以下 5 个操作:

  • (0,0)(2,0) 画线

  • (2,0)(2,2) 画线

  • (2,2)(0,2) 画线

  • (0,2)(0,0) 画线

  • 填充多边形

结果如下:

可以看到,有 9 个像素被填充:

  • 使用了 3 列 (0 到 2,包括 (2 - 0) + 1 == 3)。
  • 使用了 3 行 (0 到 2,包括 (2 - 0) + 1 == 3)。

同样,在您的情况下:(100 - 0 + 1) * (100 - 0 + 1) = 101 * 101 = 10201


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接