我试图了解多边形函数在本文档示例中的工作方式:
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吗?
如果我删除了最后一个顶点,并且使用了多边形函数,我将得到相同的结果。
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)?
答案 0 :(得分:2)
函数polygon
使用两个序列,即多边形顶点的行和列坐标。您无需在两个序列的末尾重复第一个顶点的坐标,因为假定它们定义了闭合的多边形链。
看看源代码实在令人遗憾。在skimage.draw.polygon
的内部调用skimage._draw._polygon
,依次调用辅助函数point_in_polygon
来确定像素是否位于多边形内。在此函数中,存在一个for
循环,该循环遍历组成多边形的线段。从代码中可以明显看出,由于第一行线段由索引n_vert - 1
和0
的顶点定义,因此多边形链被强制闭合。因此,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)
的长度为零,因此两个多边形实际上是同一多边形。这就是为什么您获得相同结果的原因。