Извлечение прямых линий из двумерной бинарной матрицы

Я хотел бы извлечь прямые линии из двоичной матрицы 2D.

матрица 256x128

Я хотел бы найти единицы, сгруппированные по координатам соседей.
На прикрепленном изображении есть двоичная матрица 256x128.
Из данного примера можно извлечь 4 прямые линии.
После нахождения всех сгруппированных единиц , я хотел бы иметь вектор [x1,y1,x2,y2], который содержит 2 координаты края. В данном примере, конечно, должно быть 4 вектора.

Они не могут перекреститься.
Матрица всегда содержит формы, похожие на прямые линии.

Язык не имеет значения, предпочтительно код Python.
Я пытался использовать библиотеки numpy и scipy.spatial.distance для создания решения, но не смог.

Какие методы я должен использовать или какие библиотеки/функции я должен изучить?
Заранее спасибо.


person lotdcotw    schedule 24.02.2021    source источник


Ответы (1)


Я нашел решение.
scipy.ndimage.measurements.label состоит в том, чтобы сгруппировать их по меткам.
scipy.spatial для выпуклой оболочки и самого дальнего пары.

labeled_array, num_features = label(data)  # group and label
vectors = []
for i in range(num_features):
    index = i + 1
    indices = np.argwhere(labeled_array == index)  # find the group
    if len(indices) < THRESHOLD:  # not an important line if under threshold
        continue
    candidates = indices[spatial.ConvexHull(indices).vertices]  # convex hull
    dist_mat = spatial.distance_matrix(candidates, candidates)  # distance btw
    points = np.unravel_index(dist_mat.argmax(), dist_mat.shape)  # furthest cands
    vectors.append([candidates[points[0]], candidates[points[1]]])

Вы можете найти полный файл Python в моем репозитории.
https://github.com/lotdcotw/ets2ap/blob/main/matrix2vector.py

person lotdcotw    schedule 25.02.2021