Создайте матрицу расстояний от кривой - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать матрицу, элементами которой являются расстояния до кривой, которую я определил (код ниже):

spiral curve in a matrix

Я хочувыполнить некоторые манипуляции с этим изображением, которое дает мне матрицу, содержащую все минимальные евклидовы расстояния между этой точкой и любой точкой спирали.

Я попытался использовать scipy 'ndimage.distance_transform_edt следующим образом:

import scipy.ndimage as ndi
transformed = ndi.distance_transform_edt(spiral())

Но вывод не дает мне то, что я ищу!

Кто-нибудь знает, как сгенерировать эту матрицу?

Код для спиральной генерации ниже:

import numpy as np
import matplotlib.pyplot as plt

def pol2cart(rho, phi):
    # https://stackoverflow.com/questions/20924085/python-conversion-between-coordinates
    x = rho * np.cos(phi)
    y = rho * np.sin(phi)
    return(y, x)

def spiral():

    C = 0.15
    phi = np.linspace(6, 540, 1000)
    rho =  (1 - C * np.log(phi - 5))

    # Now convert back to x, y coordinates
    y, x = pol2cart(rho, np.deg2rad(phi))

    # Center the spiral so we can see it better.
    x -= x.min()
    y -= y.min()
    x += 1
    y += 1.5

    m = np.zeros((100, 100))

    for i in range(len(x)):
        try:

            # Include some scaling factor to increase the size of the curve
            m[int(x[i]*30), int(y[i]*30)] = 1
        except IndexError:
            continue

    return m

plt.imshow(spiral())

1 Ответ

0 голосов
/ 20 февраля 2019

Согласно этой дискуссии о потоке стека на scipy.ndi.distance_transform_edt(), функция будет вычислять ближайшие евклидовы расстояния для элементов ненулевой матрицы до нулевых элементов.

Проблема в том, что ваша функция spiral() возвращает матрицу с ненулевым (точно равным 1), где кривая существует и 0 везде, где угодно.Чтобы исправить это:

import scipy.ndimage as ndi
# The original spiral curve, with 1's where the curve is defined, else 0
s = spiral()
# Transformed data: 0's representing the curve, with 1's everywhere else
TS= 1-s
transformed = ndi.distance_transform_edt(TS)

Эти усилия приводят к следующему графику:

l2 distances to spiral

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