Pemrosesan gambar menggunakan Python, GDAL dan Scikit-Image


11

Saya berjuang dengan pemrosesan dan mudah-mudahan saya akan bisa menyelesaikannya di sini.

Saya bekerja dengan Penginderaan Jauh diterapkan pada Kehutanan, terutama bekerja dengan data LiDAR. Idenya adalah menggunakan Scikit-image untuk deteksi puncak pohon. Karena saya baru menggunakan Python, saya menganggap kemenangan pribadi yang hebat untuk melakukan hal berikut:

  1. Impor CHM (dengan matplotlib);
  2. Jalankan filter gaussian (dengan paket scikit-image);
  3. Jalankan filter maksimal (dengan paket scikit-image);
  4. Jalankan peak_local_max (dengan paket scikit-image);
  5. Tunjukkan CHM dengan maxima lokal (dengan matplotlib);

Sekarang masalah saya. Ketika saya mengimpor dengan matplot, gambar kehilangan koordinat geografisnya. Jadi koordinat yang saya miliki hanyalah koordinat gambar dasar (yaitu 250.312). Yang saya butuhkan adalah untuk mendapatkan nilai pixel di bawah maxima dot lokal pada gambar (titik-titik merah pada gambar). Di sini, di forum saya melihat seorang pria menanyakan hal yang sama ( Mendapatkan nilai piksel raster GDAL di bawah titik OGR tanpa NumPy? ), Tetapi ia sudah memiliki poin di shapefile. Dalam kasus saya, titik dihitung dengan scikit-image (Ini adalah array dengan koordinat dari masing-masing tree top). Jadi saya tidak punya shapefile.

Kesimpulannya, yang saya inginkan pada akhirnya adalah file txt dengan koordinat masing-masing maxima lokal dalam koordinat geografis, misalnya:

525412 62980123 1150 ...

Maksima lokal (titik merah) dalam CHM

Jawaban:


11

Pertama, selamat datang di situs ini!

Array numpy tidak memiliki konsep sistem koordinat bawaan ke dalam array. Untuk raster 2D mereka diindeks oleh kolom dan baris.

Catatan Saya membuat asumsi bahwa Anda membaca format raster yang didukung oleh GDAL .

Dalam Python cara terbaik untuk mengimpor data raster spasial adalah dengan rasteriopaket. Data mentah yang diimpor oleh rasterio masih berupa array numpy tanpa akses ke sistem koordinat, tetapi rasterio juga memberi Anda akses ke metode affine pada array sumber yang dapat Anda gunakan untuk mengubah kolom raster dan baris ke koordinat yang diproyeksikan. Sebagai contoh:

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)

Dan dari sana Anda dapat menulis hasil Anda ke file teks sesuka Anda (saya sarankan melihat modul inbuiltcsv misalnya).


Terima kasih banyak. Sepertinya ini bisa berhasil. Karena saya baru dalam hal ini, saya masih harus terbiasa dengan banyak hal. Terima kasih atas kesabarannya.
João Paulo Pereira

1
Di Rasterio 1.x Anda dapat menggunakan source.xy (baris, kolom) untuk mendapatkan koordinat geografis.
bugmenot123


0

Silakan coba dengan kode berikut. Ini dapat digunakan untuk membaca data gambar dari raster dan menulis data yang diproses ke raster (file .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()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.