Python、GDAL、およびScikit-Imageを使用した画像処理


11

私は処理に苦労しており、できればここで解決できることを願っています。

林業に適用されるリモートセンシング、特にLiDARデータを使用して作業しています。アイデアは、ツリートップの検出にScikit-imageを使用することです。私はPythonに慣れていないので、次のことをするために大きな個人的な勝利を考えました。

  1. CHMをインポートします(matplotlibを使用)。
  2. ガウスフィルターを実行します(scikit-imageパッケージを使用)。
  3. 最大フィルターを実行します(scikit-imageパッケージを使用)。
  4. peak_local_maxを実行します(scikit-imageパッケージを使用)。
  5. ローカル最大値(matplotlibを使用)でCHMを表示します。

今私の問題。matplotでインポートすると、画像の地理座標が失われます。したがって、私が持っている座標は、基本的な画像座標(つまり、250,312)です。必要なのは、画像内の極大ドット(画像内の赤いドット)の下にあるピクセルの値を取得することです。ここで、フォーラムで同じこと(NumPyを使用せずにOGRポイントの下でGDALラスターのピクセル値を取得しますか?)私の場合、ポイントはscikit-imageで計算されました(各ツリーの頂点の座標を持つ配列です)。そのため、シェープファイルはありません。

結論として、私が最後に望むのは、地理座標での各極大点の座標を含むtxtファイルです。例えば:

525412 62980123 1150 ...

CHMの局所的最大値(赤い点)

回答:


11

まず、サイトへようこそ!

Numpy配列には、配列に組み込まれた座標系の概念がありません。2Dラスタの場合、列と行でインデックスが付けられます。

注:GDALサポートされているラスター形式を読んでいると仮定しています。

Pythonでは、空間ラスタデータをインポートする最良の方法はrasterioパッケージを使用することです。rasterioによってインポートされた生データは、座標系にアクセスできないnumpy配列のままですが、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(row、column)を使用して地理座標を取得できます。
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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.