2017-01-05 1 views
2

Я пытаюсь экспортировать результаты функции scikit-image.measure.find_contours() в качестве шейп-файла или geojson после запуска на спутниковом изображении.Как экспортировать контуры, созданные в scikit-image find_contours, в shapefile или geojson?

Выход представляет собой массив, подобный (строка, столбец) с координатами вдоль контуров, которых много.

Как составить координаты различных контуров и экспортировать их в шейп-файл (можно установить соответствующую проекцию и т. Д.)?

Мой текущий код, где «маска» моя обработанное изображение:

from skimage import measure 
import matplotlib.pyplot as plt 

contours = measure.find_contours(mask, 0.5) 

plt.imshow(mask) 
for n, contour in enumerate(contours): 
    plt.plot(contour[:,1], contour[:, 0], linewidth=1) 
+0

Учитывая вопрос, который вы задали вчера, является 'mask' логическим массивом? Если это так, может быть несколько более простой способ получить результат, который вы ищете. – jdmcbr

+0

Yep - 'mask' является булевым массивом (в результате порогового значения). – Cate

ответ

2

Что-то вдоль линий ниже, заимствовано из post первичного разработчика rasterio и fiona, должно работать, хотя я уверен, что вам нужно адаптировать немного больше. Он использует rasterio.features.shapes для определения смежных областей изображения, которые имеют некоторое значение и возвращают связанные координаты на основе преобразования растра. Затем он записывает эти записи в шейп-файл, используя fiona.

import fiona 
import rasterio.features 

schema = {"geometry": "Polygon", "properties": {"value": "int"}} 

with rasterio.open(raster_filename) as raster: 
    image = raster.read() 
    # use your function to generate mask 
    mask = your_thresholding_function(image) 
    # and convert to uint8 for rasterio.features.shapes 
    mask = mask.astype('uint8') 
    shapes = rasterio.features.shapes(mask, transform=raster.transform) 
    # select the records from shapes where the value is 1, 
    # or where the mask was True 
    records = [{"geometry": geometry, "properties": {"value": value}} 
       for (geometry, value) in shapes if value == 1] 
    with fiona.open(shape_filename, "w", "ESRI Shapefile", 
        crs=raster.crs.data, schema=schema) as out_file: 
     out_file.writerecords(records) 

+0

Это работает с очень небольшим количеством изменений. Использование 'rasterio.open()' вместо моего исходного 'gdal.Open()' отлично, поскольку я могу перейти прямо к любой манипуляции с изображением на массиве (порог и несколько других шагов). Добавление 'mask = np.invert (mask)' непосредственно перед 'rasterio.features.shapes' позволяет мне вытащить обратные регионы (полезно для меня в этом случае). – Cate

+0

Я думаю, что мой пример не интегрирует часть вашего вопроса. Вы можете взглянуть на этот вопрос (http://gis.stackexchange.com/questions/193653/plot-shapefile-on-top-of-raster-using-plot-and-imshow-from-matplotlib) о построении shapefile на растере в python. – jdmcbr

0

Вы должны установить библиотеки Python geojson и работать с этим.

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

0

@Cate вы могли бы использовать те row, column координат матрицы и построить их через http://scikit-image.org/docs/dev/api/skimage.draw.html#skimage.draw.polygon (заполняется многоугольник), http://scikit-image.org/docs/dev/api/skimage.draw.html#skimage.draw.polygon_perimeter (только периметр), или создать свой собственный полигон замышляет функцию на вершине http://matplotlib.org/api/patches_api.html#matplotlib.patches.Polygon.

+0

Спасибо @soupault, пытаясь заставить это работать во вложенной структуре списка, которую 'find_contours()' выдает. С помощью каждого многоугольника в качестве подписок вы создадите шейп-файл и добавите его, когда будете перебирать список, или есть простой способ написать их все сразу? – Cate

+0

@ Прошу прощения, я не знаком с указанными форматами (shapefile, geojson). Я думаю, вам стоит взглянуть на https://pypi.python.org/pypi/geojson и https://pypi.python.org/pypi/pyshp. Возможно, функциональность, которую вы ищете, уже существует. – soupault

Смежные вопросы