Обробка зображень за допомогою Python, GDAL та Scikit-Image


11

Я борюся з обробкою і, сподіваюся, мені вдасться вирішити тут.

Я працюю з дистанційним зондуванням, застосованим до лісового господарства, особливо працюю з даними LiDAR. Ідея полягає у використанні Scikit-зображення для виявлення верхівки дерева. Оскільки я новачок у Python, я вважав великим особистим тріумфом зробити наступне:

  1. Імпорт CHM (з matplotlib);
  2. Запустіть фільтр гаусса (з пакетом scikit-образ);
  3. Запустити фільтр максимумів (із пакетом scikit-образ);
  4. Запустіть peak_local_max (з пакетом scikit-зображення);
  5. Покажіть CHM з локальними максимумами (з matplotlib);

Тепер моя проблема. Коли я імпортую за допомогою matplot, зображення втрачає географічні координати. Тож у мене координати є лише основними координатами зображень (тобто 250 312). Мені потрібно отримати значення пікселя під локальною крапкою на зображенні (червоні точки на зображенні). Тут, на форумі, я побачив одного хлопця, який запитував те саме ( Отримання значення пікселя GDAL-растра під OGR-точкою без NumPy? ), Але у нього вже були пункти у файл-формі. У моєму випадку точки були обчислені scikit-зображення (Це масив з координатами верхівки кожного дерева). Тож у мене немає формфайлу.

На закінчення те, що я хочу врешті-решт - це файл txt з координатами кожного локального максимуму в географічних координатах, наприклад:

525412 62980123 1150 ...

Локальні максимуми (червоні точки) в CHM

Відповіді:


11

По-перше, ласкаво просимо на сайт!

Numpy масиви не мають поняття систем координат, вбудованих у масив. Для двовимірного растру вони індексуються стовпцем та рядком.

Примітка. Я роблю припущення, що ви читаєте растровий формат, підтримуваний GDAL .

У Python найкращим способом імпорту просторових растрових даних є rasterioпакет. Сировинні дані, імпортовані rasterio, як і раніше, є нумерованим масивом без доступу до систем координат, але rasterio також надає вам доступ до афінного методу у вихідному масиві, який ви можете використовувати для перетворення растрових стовпців та рядків у прогнозовані координати. Наприклад:

import rasterio

# The best way to open a raster with rasterio is through the context manager
# so that it closes automatically

with rasterio.open(path_to_raster) as source:

    data = source.read(1) # Read raster band 1 as a numpy array
    affine = source.affine

# ... do some work with scikit-image and get an array of local maxima locations
# e.g.
# maxima = numpy.array([[0, 0], [1, 1], [2, 2]])
# Also note that convention in a numy array for a 2d array is rows (y), columns (x)

for point in maxima: #Loop over each pair of coordinates
    column = point[1]
    row = point[0]
    x, y = affine * (column, row)
    print x, y

# Or you can do it all at once:

columns = maxima[:, 1]
rows = maxima[:, 0]

xs, ys = affine * (columns, rows)

А звідти ви можете записати свої результати в текстовий файл, як вам завгодно (я б порадив переглянути приклад вбудованого csvмодуля ).


Велике спасибі. Схоже, це може спрацювати. Оскільки я в цьому новачок, мені ще доводиться знайомитися з багатьма речами. Дякую за терпіння
Жоао Пауло Перейра

1
У Rasterio 1.x ви можете використовувати source.xy (рядок, стовпець) для отримання геокоординати.
bugmenot123


0

Спробуйте скористатися наступним фрагментом коду. Це можна використовувати для зчитування зображень із растрових даних і запису оброблених даних у растр (файл .geotiff).

from PIL import Image,ImageOps
import numpy as np
from osgeo import gdal
#from osgeo import gdal_array
#from osgeo import osr
#from osgeo.gdalconst import *
#import matplotlib.pylab as plt

#from PIL import Image, ImageOps
#import gdal
#from PIL import Image
gdal.AllRegister()

################## Read Raster #################
inRaster='C:\python\Results\Database\Risat1CRS\CRS_LEVEL2_GEOTIFF\scene_HH\imagery_HH.tif'

inDS=gdal.Open(inRaster,1)
geoTransform = inDS.GetGeoTransform()
band=inDS.GetRasterBand(1)
datatype=band.DataType
proj = inDS.GetProjection()
rows = inDS.RasterYSize
cols=inDS.RasterXSize
data=band.ReadAsArray(0,0,cols,rows)#extraction of data to be processed#
############write raster##########
driver=inDS.GetDriver()
outRaster='C:\\python\\Results\\Database\\Temporary data base\\clipped_26July2017\\demo11.tif'
outDS = driver.Create(outRaster, cols,rows, 1,datatype)
geoTransform = inDS.GetGeoTransform()
outDS.SetGeoTransform(geoTransform)
proj = inDS.GetProjection()
outDS.SetProjection(proj)
outBand = outDS.GetRasterBand(1)
outBand.WriteArray(data1,0,0)
#data is the output array to written in tiff file
outDS=None 
im2=Image.open('C:\\python\\Results\\Database\\Temporary data base\\clipped_26July2017\\demo11.tif');
im2.show()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.