Изображение и диаграмма Вороного на одной фигуре - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно нанести тесселяцию Вороного поверх существующего изображения, используя scipy.spatial.Voronoi. Я импортировал изображение в виде массива numpy, используя matplotlib.pyplot:

img_file = 'my_image.png'
img = plt.imread(os.path.join(data_dir, img_file))
fig = plt.figure()
ax = fig.add_subplot(111)

Когда я отображаю изображение, оно работает нормально:

ax.imshow(img)

мое начальное изображение

Затем я хочу добавить на него граф Вороного (для некоторых точек, которые я выбираю произвольно), поэтому я делаю:

points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]])

vor = Voronoi(points)
voronoi_plot_2d(vor, ax=ax)
plt.show()

и я получаю это: Неудачная попытка наложения графика на изображение

И когда я строю график, вот что я получаю: Вороной тесселяции отдельно

Итак, я хотел нарисовать их друг над другом, используя одну и ту же ось (ax), но вместо этого это привело к окрашиванию в районах Вороного. Буду очень признателен за любую помощь в выяснении, как разместить изображение на заднем плане, а Вороной - сверху!

1 Ответ

0 голосов
/ 26 марта 2019

Это на самом деле работает, я думаю, точки вороноя должны быть выбраны правильно:

import matplotlib.pylab as plt
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import scipy.ndimage as ndimage

img_file = 'bear.png'
img = plt.imread(img_file)

points = [] 
for i in range(100):
    points.append([np.random.uniform(0, img.shape[0]),np.random.uniform(0, img.shape[1])])
points = np.array(points)

vor = Voronoi(points)

fig = plt.figure(figsize=(20,20))
ax = fig.add_subplot(111)
ax.imshow(ndimage.rotate(img, 90))
voronoi_plot_2d(vor, point_size=10, ax=ax)
plt.show()

enter image description here

...