Функция многоугольника Skimage: Почему последняя вершина повторяется в примере документации многоугольника? - PullRequest
2 голосов
/ 12 марта 2019

Я пытаюсь понять, как работает функция многоугольника, на следующем примере документации:

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 Ответ

2 голосов
/ 12 марта 2019

Функция 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) равна нулю, оба полигона фактически являются одним и тем же полигоном. Вот почему вы получаете те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...