使用Python,GDAL和Scikit-Image进行图像处理


11

我正在努力进行处理,希望可以在此解决。

我使用应用于林业的遥感技术,尤其是处理LiDAR数据。想法是使用Scikit图像进行树顶检测。由于我是Python的新手,因此我认为完成以下工作非常有个人才能:

  1. 导入CHM(使用matplotlib);
  2. 运行高斯过滤器(带有scikit-image包);
  3. 运行一个最大值过滤器(带有scikit-image包);
  4. 运行peak_local_max(带有scikit-image包);
  5. 显示带有局部最大值的CHM(带有matplotlib);

现在我的问题。当我使用matplot导入时,图像会丢失其地理坐标。因此,我拥有的坐标只是基本图像坐标(即250,312)。我需要获取图像中局部最大值点(图像中的红色点)下的像素值。在论坛的这里,我看到一个人在问同样的事情(在没有NumPy的情况下,在OGR点下获取GDAL栅格的GDAL像素的像素值?),但是他已经在shapefile中包含了这些点。在我的情况下,这些点是使用scikit-image计算的(这是一个具有每个树顶坐标的数组)。所以我没有shapefile。

总之,我最后想要的是一个txt文件,其中每个局部最大值的坐标都在地理坐标中,例如:

525412 62980123 1150 ...

CHM中的局部最大值(红点)

Answers:


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(行,列)来获取地理坐标。
bugmenot123 '16


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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.