Как найти ближайшую координату x, y из определенного пикселя, используя python - PullRequest
0 голосов
/ 15 мая 2018

Моя цель - найти координату ближайшей точки x, y для каждого пикселя.Исходя из этого, я должен раскрасить точки пикселей.

Вот то, что я пробовал, Код ниже нарисует точки.

import numpy as np
import matplotlib.pyplot as plt 

points = np.array([[0,40],[0,0],[5,30],[4,10],[10,25],[20,5],[30,35],[35,3],[50,0],[45,15],[40,22],[50,40]]) 
print (points)
x1, y1 = zip(*points)
plt.plot(x1,y1,'.')
plt.show()

Here is the output of the above codeТеперь нужно найти ближайшую точку для каждого пикселя.Я нашел что-то вроде этого, где я должен вручную дать координаты каждого пикселя, чтобы получить ближайшую точку.

from scipy import spatial
import numpy as np
A = np.random.random((10,2))*100
print (A)
pt = np.array([[6, 30],[9,80]])
print (pt)
for each in pt:
    A[spatial.KDTree(A).query(each)[1]] # <-- the nearest point 
    distance,index = spatial.KDTree(A).query(each)
    print (distance) # <-- The distances to the nearest neighbors
    print (index) # <-- The locations of the neighbors
    print  (A[index])

Вывод будет таким,

[[1.76886192e+01 1.75054781e+01]
 [4.17533199e+01 9.94619127e+01]
 [5.30943347e+01 9.73358766e+01]
 [3.05607891e+00 8.14782701e+01]
 [5.88049334e+01 3.46475520e+01]
 [9.86076676e+01 8.98375851e+01]
 [9.54423012e+01 8.97209269e+01]
 [2.62715747e+01 3.81651805e-02]
 [6.59340306e+00 4.44893348e+01]
 [6.66997434e+01 3.62820929e+01]]
[[ 6 30]
 [ 9 80]]
14.50148095039858
8
[ 6.59340306 44.48933479]
6.124988197559344
3
[ 3.05607891 81.4782701 ]

Вместодать каждую точку вручную, я хочу взять каждый пиксель с изображения, и я хотел найти ближайшую синюю точку.Это мой первый вопрос.

После этого я хочу классифицировать эти точки на две категории. По пикселям и точкам я хочу их раскрасить, в основном я хочу создать кластер на них.Something like this  am looking for

Это не в правильной форме.Но в конце я хочу вот так.Заранее спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018
  • Используйте cKDTree вместо KDTree, что быстрее (см. Этот ответ ).
  • Вы можете дать kdtree массив точек для запроса вместо того, чтобы проходить по всемих.
  • Создание дерева kd является дорогостоящей операцией по сравнению с запросом к нему, поэтому создайте его один раз и выполняйте запрос много раз.

Сравните следующие два фрагмента кода в моих тестах второйодин запуск в 800 раз быстрее.

from timeit import default_timer as timer

np.random.seed(0)
A = np.random.random((1000,2))*100
pt = np.random.randint(0,100,(100,2))

start1 = timer()
for each in pt:
    A[spatial.KDTree(A).query(each)[1]] 
    distance,index = spatial.KDTree(A).query(each)
end1 = timer()
print end1-start1

start2 = timer()
kdt = spatial.cKDTree(A)  # cKDTree + outside construction 
distance,index = kdt.query(pt)  
A[index] 
end2 = timer()
print end2-start2
0 голосов
/ 15 мая 2018

вы можете использовать scikit-learn для этого:

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=1)
labels = list(range(len(points)))
neigh.fit(points, labels) 
pred = neigh.predict(np.random.random((10,2))*50)

, если вы хотите сами точки, а не их метки классов, вы можете сделать

points[pred]
...