Python, GDAL ve Scikit-Image kullanarak görüntü işleme


11

Bir işlemle uğraşıyorum ve umarım burada çözebilirim.

Ormancılığa uygulanan Uzaktan Algılama ile çalışıyorum, özellikle LiDAR verileriyle çalışıyorum. Fikir, ağaç üstü tespiti için Scikit görüntüsünü kullanmaktır. Python'da yeni olduğum için, aşağıdakileri yapmak için büyük bir kişisel zafer düşündüm:

  1. Bir CHM (matplotlib ile) içe aktarın;
  2. Gauss filtresi çalıştırın (scikit-görüntü paketi ile);
  3. Bir maxima filtresi çalıştırın (scikit görüntü paketi ile);
  4. Peak_local_max komutunu çalıştırın (scikit görüntü paketi ile);
  5. CHM'yi yerel maksimuma göster (matplotlib ile);

Şimdi benim sorunum. Matplot ile içe aktardığımda, görüntü coğrafi koordinatlarını kaybeder. Yani sahip olduğum koordinatlar sadece temel görüntü koordinatlarıdır (yani 250.312). Ne ihtiyacım var görüntüdeki yerel maxima nokta (görüntüdeki kırmızı noktalar) altında piksel değerini elde etmektir. Burada forumda aynı şeyi soran bir adam gördüm ( NumPy olmadan OGR noktası altında GDAL rasterinin piksel değeri alınıyor mu? ), Ama zaten bir şekil dosyasında puanları vardı. Benim durumumda puanlar scikit-image ile hesaplandı (her ağacın tepesinin koordinatlarına sahip bir dizidir). Yani şekil dosyam yok.

Sonuç olarak, sonunda istediğim, coğrafi koordinatlarda her bir yerel maksimumun koordinatlarını içeren bir txt dosyasıdır, örneğin:

525412 62980123 1150 ...

CHM'de yerel maksima (kırmızı noktalar)

Yanıtlar:


11

Öncelikle, siteye hoş geldiniz!

Numpy dizilerin diziye yerleştirilmiş bir koordinat sistemleri kavramı yoktur. 2B bir tarama için sütun ve sıra ile dizine eklenirler.

Not GDAL tarafından desteklenen bir raster formatı okuduğunuzu varsayıyorum .

Python'da uzamsal raster verilerini almanın en iyi yolu rasteriopakettir. Rasterio tarafından içe aktarılan ham veriler hala koordinat sistemlerine erişimi olmayan sayısal bir dizidir, ancak rasterio ayrıca kaynak dizisi üzerindeki raster sütunlarını ve satırlarını öngörülen koordinatlara dönüştürmek için kullanabileceğiniz bir yakın çekim yöntemine erişmenizi sağlar. Örneğin:

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)

Ve sonuçlarınızı istediğiniz gibi bir metin dosyasına yazabilirsiniz ( örneğin dahili csvmodüle bir göz atmanızı öneririm ).


Çok teşekkür ederim. Bu işe yarayabilir gibi görünüyor. Bu konuda yeni olduğum için hala birçok şeye aşina olmalıyım. Sabrınız için teşekkürler.
João Paulo Pereira

1
Rasterio 1.x'te coğrafi koordinatı almak için source.xy (satır, sütun) kullanabilirsiniz.
bugmenot123


0

Lütfen aşağıdaki kod parçasını deneyin. Bu, rasterden görüntü verilerini okumak ve raster'e (.geotiff dosyası) işlenmiş verileri yazmak için kullanılabilir.

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.