Я пытаюсь создать программу, используя tkinter , cartopy и matplotlib , которая позволила бы пользователям рисовать полигоны на карте. Как только многоугольник закрыт (щелчок правой кнопкой мыши), я хочу преобразовать его в маску, где пиксели внутри многоугольника устанавливаются на 1, а пиксели снаружи устанавливаются на 0, сохраняя при этом информацию о долготе и широте. Мне нужны эти маски, чтобы позже применить данные, смоделированные по Гренландии. < /P>
Вот минимальная версия моего кода: < /p>
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import tkinter as tk
def on_click(event):
global polygon_closed, pointsX, pointsY
if event.button == 1 and not polygon_closed:
if len(pointsX) > 0:
ax.plot([pointsX[-1], event.xdata], [pointsY[-1], event.ydata], 'r-')
pointsX.append(event.xdata)
pointsY.append(event.ydata)
ax.plot(event.xdata, event.ydata, 'r+')
canvas.draw()
elif event.button == 3 and not polygon_closed:
ax.plot([pointsX[0], pointsX[-1]], [pointsY[0], pointsY[-1]], 'r-')
maskedZone = list(zip(pointsX, pointsY))
polygon = Polygon(maskedZone, closed=True, facecolor='red', edgecolor='black', alpha=0.5)
ax.add_patch(polygon)
canvas.draw()
polygon_closed = True
print(maskedZone)
root = tk.Tk()
root.title("Mask drawing")
root.geometry("500x700")
projection = ccrs.Stereographic(central_latitude=70, central_longitude=-42)
fig, ax = plt.subplots(facecolor="w", subplot_kw=dict(projection=projection))
ax.set_extent([-65, -25, 59, 85], crs=ccrs.PlateCarree())
ax.coastlines()
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.gridlines(draw_labels=True)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
canvas.mpl_connect("button_press_event", on_click)
pointsX = []
pointsY = []
polygon_closed = False
root.mainloop()
< /code>
И вот пример вывода после закрытия многоугольника: < /p>
[(np.float64(38555.16314861295), np.float64(645247.4786037477)),
(np.float64(-126380.37478850619), np.float64(221127.52390829823)),
(np.float64(374316.793949177), np.float64(256470.85346625233))]
Я попытался создать shapely.polygon , а затем с использованием rasterio.features.rasterize для преобразования в маску, но растер в конечном итоге был полон всего 0 , даже если есть форма для растешиния. (Возможно, выход 10x10 слишком мал, поэтому он не «просматривать» форму) < /p>
import shapely
import rasterio.features
maskedZone = list(zip(pointsX, pointsY))
maskPolygon = shapely.Polygon(maskedZone)
raster = rasterio.features.rasterize([(maskPolygon, 1)], out_shape=(10, 10), all_touched=True)
< /code>
Вопрос: < /strong>
Как я могу преобразовать нарисованный многоугольник в двухмерную двоичную маску? Я хотел бы определить обычную сетку в той же степени, что и карта, и для каждой точки сетки назначьте: < /p>
1 Если точка находится внутри многоугольника < /li>
0, если она выходит за пределы < /li>
< /ul>
Я не уверен, как справиться с надписью. Я читаю, что люди используют rasterio
, но я не уверен, как правильно интегрировать прогнозы.
Любая помощь или направление будут оценены.>
Я пытаюсь создать программу, используя tkinter , cartopy и matplotlib , которая позволила бы пользователям рисовать полигоны на карте. Как только многоугольник закрыт (щелчок правой кнопкой мыши), я хочу преобразовать его в маску, где пиксели внутри многоугольника устанавливаются на 1, а пиксели снаружи устанавливаются на 0, сохраняя при этом информацию о долготе и широте. Мне нужны эти маски, чтобы позже применить данные, смоделированные по Гренландии. < /P> Вот минимальная версия моего кода: < /p> [code]import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import cartopy.crs as ccrs import cartopy.feature as cfeature import tkinter as tk
def on_click(event): global polygon_closed, pointsX, pointsY
if event.button == 1 and not polygon_closed: if len(pointsX) > 0: ax.plot([pointsX[-1], event.xdata], [pointsY[-1], event.ydata], 'r-')
root.mainloop() < /code> И вот пример вывода после закрытия многоугольника: < /p> [(np.float64(38555.16314861295), np.float64(645247.4786037477)), (np.float64(-126380.37478850619), np.float64(221127.52390829823)), (np.float64(374316.793949177), np.float64(256470.85346625233))] [/code] Я попытался создать shapely.polygon , а затем с использованием rasterio.features.rasterize для преобразования в маску, но растер в конечном итоге был полон всего 0 , даже если есть форма для растешиния. (Возможно, выход 10x10 слишком мал, поэтому он не «просматривать» форму) < /p> [code]import shapely import rasterio.features
maskedZone = list(zip(pointsX, pointsY)) maskPolygon = shapely.Polygon(maskedZone) raster = rasterio.features.rasterize([(maskPolygon, 1)], out_shape=(10, 10), all_touched=True) < /code> Вопрос: < /strong> Как я могу преобразовать нарисованный многоугольник в двухмерную двоичную маску? Я хотел бы определить обычную сетку в той же степени, что и карта, и для каждой точки сетки назначьте: < /p>
1 Если точка находится внутри многоугольника < /li> 0, если она выходит за пределы < /li> < /ul> Я не уверен, как справиться с надписью. Я читаю, что люди используют rasterio [/code], но я не уверен, как правильно интегрировать прогнозы. Любая помощь или направление будут оценены.>
Я пытаюсь создать программу, используя tkinter , cartopy и matplotlib , которая позволила бы пользователям рисовать полигоны на карте. Как только многоугольник закрыт (щелчок правой кнопкой мыши), я хочу преобразовать ее в маску, где пиксели внутри...
Я пытаюсь создать программу, используя tkinter , cartopy и matplotlib , которая позволила бы пользователям рисовать полигоны на карте. Как только многоугольник закрыт (щелчок правой кнопкой мыши), я хочу преобразовать ее в маску, где пиксели внутри...
Я видел этот вопрос, но не смог найти полного ответа. У меня есть простой фигурный многоугольник, называемый многоугольником. Я хотел бы извлечь этот многоугольник как двоичную маску (в идеале массив NumPy). Как бы мне это сделать?
Мне также удалось...
Я хочу сегментировать изображение с использованием yolo8, а затем создать маску для всех объектов на изображении с конкретным классом.
Я разработал этот код:
img=cv2.imread('images/bus.jpg')
model = YOLO('yolov8m-seg.pt')
results =...
У меня есть 2D двоичная маска (не нужной прямой) линии. Линия имеет определенную толщину, но намного длиннее толстой. Мне нужен алгоритм Python, который обеспечивает кусочный путь через центр бинарной линии. Я пытался использовать Skeletonize, но он...