Skimage多边形功能:为什么在多边形文档示例中最后一个顶点重复?

时间:2019-03-12 04:09:09

标签: python python-3.x scikit-image

我试图了解多边形函数在本文档示例中的工作方式:

from skimage.draw import polygon
img = np.zeros((10, 10), dtype=np.uint8)
r = np.array([1, 2, 8, 1])
c = np.array([1, 7, 4, 1])
rr, cc = polygon(r, c)
img[rr, cc] = 1
img
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)

我对此有一些疑问:

r变量具有行坐标,而c变量具有列坐标。从我的角度来看,这意味着有4个这样的顶点:(1,1),(2,7),(8,4)和(1,1)。但是当我看到img数组时,它看起来像一个三角形……顶点的总数不应该是3而不是4吗?

enter image description here

如果我删除了最后一个顶点,并且使用了多边形函数,我将得到相同的结果。

r = np.array([1, 2, 8])
c = np.array([1, 7, 4])
rr, cc = polygon(r, c)  

# rr2 = array([2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 7])
# cc2 = array([1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 3, 4, 5, 4, 4])

r2 = np.array([1, 2, 8, 1])
c2 = np.array([1, 7, 4, 1])
rr2, cc2 = polygon(r2, c2)  

# rr2 = array([2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 7])
# cc2 = array([1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 3, 4, 5, 4, 4])

为什么我得到相同的结果?它忽略了最后一个顶点(1,1)?

1 个答案:

答案 0 :(得分:2)

函数polygon使用两个序列,即多边形顶点的行和列坐标。您无需在两个序列的末尾重复第一个顶点的坐标,因为假定它们定义了闭合的多边形链。

看看源代码实在令人遗憾。在skimage.draw.polygon的内部调用skimage._draw._polygon,依次调用辅助函数point_in_polygon来确定像素是否位于多边形内。在此函数中,存在一个for循环,该循环遍历组成多边形的线段。从代码中可以明显看出,由于第一行线段由索引n_vert - 10的顶点定义,因此多边形链被强制闭合。因此,polygon([1, 2, 8, 1], [1, 7, 4, 1])返回位于由以下线段定义的多边形内的像素的坐标:

(1, 1) - (1, 1)
(1, 1) - (2, 7)
(2, 7) - (8, 4)
(8, 4) - (1, 1)

同时polygon([1, 2, 8], [1, 7, 4])返回由以下线段定义的多边形内的像素的坐标

(8, 4) - (1, 1)
(1, 1) - (2, 7)
(2, 7) - (8, 4)

由于段(1, 1) - (1, 1)的长度为零,因此两个多边形实际上是同一多边形。这就是为什么您获得相同结果的原因。