Python, GDAL 및 Scikit-Image를 사용한 이미지 처리


11

처리에 어려움을 겪고 있으며 여기서 해결할 수 있기를 바랍니다.

임업에 적용된 원격 감지, 특히 LiDAR 데이터로 작업합니다. 아이디어는 트리 상단 감지에 Scikit 이미지를 사용하는 것입니다. 저는 Python을 처음 사용하기 때문에 다음과 같은 일을 할 수있는 위대한 개인의 승리를 고려했습니다.

  1. CHM 가져 오기 (matplotlib 포함);
  2. 가우시안 필터를 실행합니다 (scikit-image 패키지 사용).
  3. maxima 필터를 실행하십시오 (scikit-image 패키지 사용).
  4. scikit-image 패키지와 함께 peak_local_max를 실행하십시오.
  5. 로컬 최대 값 (matplotlib 포함)으로 CHM을 표시하십시오.

이제 내 문제. matplot으로 가져 오면 이미지의 지리적 좌표가 손실됩니다. 따라서 내가 가지고있는 좌표는 기본 이미지 좌표 (예 : 250,312)입니다. 내가 필요한 것은 이미지의 로컬 최대 점 아래의 픽셀 값을 얻는 것입니다 (이미지의 빨간색 점). 여기 포럼에서 나는 같은 일을 (부탁 한 남자를 보았다 NumPy와없는 OGR 점에서 GDAL 래스터의 픽셀 값을 얻기? ), 그러나 그는 이미 Shape 파일의 포인트를 가지고 있었다. 필자의 경우 포인트는 scikit-image로 계산되었습니다 (각 트리 탑의 좌표가있는 배열입니다). 그래서 shapefile이 없습니다.

결론적으로, 내가 원하는 것은 지리적 좌표로 각 로컬 최대 점의 좌표가있는 txt 파일입니다.

525412 62980123 1150 ...

CHM의 로컬 최대 값 (빨간색 점)

답변:


11

먼저 사이트에 오신 것을 환영합니다!

Numpy 배열에는 배열에 내장 된 좌표계 ​​개념이 없습니다. 2D 래스터의 경우 열 및 행별로 색인이 생성됩니다.

참고 GDAL지원 하는 래스터 형식을 읽는 것으로 가정합니다 .

파이썬에서 공간 래스터 데이터를 가져 오는 가장 좋은 방법은 rasterio패키지를 사용하는 것입니다. rasterio로 가져온 원시 데이터는 여전히 좌표계에 액세스 할 수없는 numpy 배열이지만, rasterio를 사용하면 래스터 열과 행을 투영 된 좌표로 변환하는 데 사용할 수있는 소스 배열의 affine 메소드에 액세스 할 수도 있습니다. 예를 들면 다음과 같습니다.

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모듈 을 살펴 보는 것이 좋습니다 ).


대단히 감사합니다. 이것이 효과가있는 것 같습니다. 나는 이것에 익숙하지 않기 때문에 여전히 많은 것들에 익숙해 져야합니다. 양해 해 주셔서 감사합니다.
João Paulo Pereira

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.