Processamento de dados geográficos Python treze: processamento de dados raster (1)


1. Reamostragem de dados

  Reamostragem refere-se ao processo de interpolação das informações de um tipo de informação de pixel de outro tipo de pixel. No sensoriamento remoto, a reamostragem é o processo de extração de imagens de baixa resolução de imagens de sensoriamento remoto de alta resolução . Os métodos de reamostragem comumente usados ​​incluem interpolação do vizinho mais próximo, interpolação bilinear e interpolação de convolução cúbica.
  A função ReadAsArray pode reamostrar os dados lidos e especificar o tamanho do buffer de saída ou passar uma matriz de buffer existente.
Formato da função:

band.ReadAsArray([xoff], [yoff], [win_xsize], [win_ysize], [buf_xsize], [buf_ysize], [buf_obj])

  1. xoff é a coluna para iniciar a leitura e o valor padrão é 0.
  2. yoff é a linha para iniciar a leitura e o valor padrão é 0.
  3. win_xsize é o número de colunas a serem lidas, o padrão é ler todas.
  4. win_ysize é o número de linhas a serem lidas e o padrão é ler todas.
  5. buf_xsize é o número de colunas na matriz de saída e o valor padrão é o valor de win_xsize.
  6. buf_ysize é o número de linhas na matriz de saída e o valor padrão é o valor de win_ysize.
  7. buf_obj é uma matriz NumPy usada para inserir dados em vez de criar uma nova matriz. Se necessário, os dados serão reamostrados para se ajustarem ao array e o valor correspondente será convertido para o tipo de dados do array.

  Arrays com tamanhos maiores serão reamostrados para pixels menores, arrays com tamanhos menores serão reamostrados para pixels maiores usando a interpolação do vizinho mais próximo


Reamostrar para pixels menores:

  Você precisa fornecer uma matriz com uma dimensão maior do que os dados originais, para que os valores de pixel sejam reutilizados para preencher a matriz de destino:

import os
from osgeo import gdal

os.chdir(r'D:\geodata\Landsat\Washington')

in_ds = gdal.Open('p047r027_7t20000730_z10_nn10.tif')
in_band = in_ds.GetRasterBand(1)

# 计算输出行列数
# 输入数翻倍,因为我将像素大小减半
out_rows = in_band.YSize * 2
out_columns = in_band.XSize * 2

# 创建输出数据集
gtiff_driver = gdal.GetDriverByName('GTiff')
out_ds = gtiff_driver.Create('band1_resampled.tif',
    out_columns, out_rows)

# 编辑地理变换
# 像素变为原来的 1/4
out_ds.SetProjection(in_ds.GetProjection())
geotransform = list(in_ds.GetGeoTransform())
geotransform[1] /= 2
geotransform[5] /= 2
out_ds.SetGeoTransform(geotransform)

# 读取数据时,指定一个较大的缓冲
data = in_band.ReadAsArray(
    buf_xsize=out_columns, buf_ysize=out_rows)

# 将数据写入输出光栅
out_band = out_ds.GetRasterBand(1)
out_band.WriteArray(data)

# 为较大的图像构建合适的概视图
out_band.FlushCache()
out_band.ComputeStatistics(False)
out_ds.BuildOverviews('average', [2, 4, 8, 16, 32, 64])

del out_ds

  Exibição de imagem:
Insira a descrição da imagem aqui
  informações do atributo:


2. Sequência de bytes

1ReadRaster([xoff], [yoff], [xsize], [ysize], [buf_xsize], [buf_ysize], [buf_type], [band_list],[buf_pixel_space], [buf_line_space], [buf_band_space])

  1. xoff é o ponto de partida para a leitura da coluna e o valor padrão é 0.
  2. yoff é o ponto de partida para a leitura da linha e o valor padrão é 0.
  3. xsize é o número de colunas a serem lidas e o padrão é ler todas.
  4. ysize é o número de linhas lidas e o padrão é ler todas.
  5. buf_xsize é o número de colunas na matriz de saída e o valor padrão é win_xsize. Se este valor for diferente de win_xsize, os dados serão amostrados novamente.
  6. buf_ysize é o número de linhas na matriz de saída, o valor padrão é usar o valor win_ysize. Se este valor for diferente de win_ysize, os dados serão amostrados novamente.
  7. buf_type é o tipo de dados de destino GDAL da sequência retornada e o valor padrão é o mesmo que os dados de origem.
  8. band_list é a lista de bandas a serem lidas, todas as bandas são lidas por padrão.
  9. buf_pixel_space é o deslocamento de byte entre os pixels na sequência e o valor padrão é o tamanho de buf_type.
  10. buf_line_space é o deslocamento de byte entre as linhas na sequência. O valor padrão é buf_type multiplicado por xsize.
  11. buf_band_space é o deslocamento de byte entre as colunas na sequência. O valor padrão é buf_line_space multiplicado por ysize.
import os
import numpy as np
from osgeo import gdal

data_dir = r'D:\geodata'

os.chdir(os.path.join(data_dir, 'Landsat', 'Washington'))
ds = gdal.Open('Landsat_color.tif')
data = ds.ReadRaster(1400, 6000, 2, 2, band_list=[1])
print(data)

# 取出第一个值,将从字节转换为数字
print(data[0])

# 尝试更改第一个像素的值。
# 输出失败,因为不能更改字节字符串
data[0] = 50

# 将字节字符串转换为字节数组
# 更改第一个值,输出成功
bytearray_data = bytearray(data)  # bytearray是字节数组
bytearray_data[0] = 50
print(bytearray_data[0])

b'\x1c\x1d\x1c\x1e'
28
50

  2. Converta uma string de bytes em uma tupla de valores de pixel:

import struct
tuple_data = struct.unpack('B' * 4, data) # 指定4个字节
print(tuple_data)
(28, 29, 28, 30)

  3. Converta a tupla em uma matriz numpy:

numpy_data1 = np.array(tuple_data)
print(numpy_data1)
[28 29 28 30]

  4. Converta a string de bytes em uma matriz numpy:

# 将字节字符串转换为numpy数组
# 重构一个numpy数组,使其具有2行2列,就像读入的原始数据一样
numpy_data2 = np.fromstring(data, np.int8)
reshaped_data = np.reshape(numpy_data2, (2,2))
print(reshaped_data)
[[28 29]
 [28 30]]

  5. Use sequências de bytes para reamostrar a imagem para um tamanho de pixel maior:

import os
import numpy as np
from osgeo import gdal

os.chdir(r'D:\geodata\Landsat\Washington')

# 打开输入栅格
in_ds = gdal.Open('Landsat_color.tif')

# 计算输出的行和列的数量
# 输入数字的一半,因为要使像素的两倍大
out_rows = int(in_ds.RasterYSize / 2)
out_columns = int(in_ds.RasterXSize / 2)
num_bands = in_ds.RasterCount

# 创建输出数据集
gtiff_driver = gdal.GetDriverByName('GTiff')
out_ds = gtiff_driver.Create('Landsat_color_resampled.tif',
    out_columns, out_rows, num_bands)

# 编辑地理变换,让像素尺寸变大
# 像素宽度、像素高度加倍
out_ds.SetProjection(in_ds.GetProjection())
geotransform = list(in_ds.GetGeoTransform())
geotransform[1] *= 2
geotransform[5] *= 2
out_ds.SetGeoTransform(geotransform)

# 利用较小的缓冲来读写数据
data = in_ds.ReadRaster(
    buf_xsize=out_columns, buf_ysize=out_rows)

# 将数据写入栅格中
out_ds.WriteRaster(0, 0, out_columns, out_rows, data)

# 为较小的图像创建合适数量的概视图
out_ds.FlushCache()
for i in range(num_bands):
    out_ds.GetRasterBand(i + 1).ComputeStatistics(False)
out_ds.BuildOverviews('average', [2, 4, 8, 16])

del out_ds

Os resultados mostram que:

Insira a descrição da imagem aqui


3. Subdataset

  A imagem MODIS (espectrômetro de imagem de resolução média) é um arquivo de formato de dados hierárquico (HDF). Se os dados contiverem subconjuntos de dados, a função GetSubDatasets () pode ser usada para obter uma lista de seus subconjuntos de dados e, em seguida, usar essas informações de lista para abrir os subconjuntos necessários.

  Estrutura do conjunto de dados:

Insira a descrição da imagem aqui

import os
import numpy as np
from osgeo import gdal

data_dir = r'D:\geodata'

# 从MODIS文件中获取子数据集的名称和描述
# 并打印,输出NDVI(归一化植被指数)
os.chdir(os.path.join(data_dir, 'Modis'))
ds = gdal.Open('MYD13Q1.A2014313.h20v11.005.2014330092746.hdf')
subdatasets = ds.GetSubDatasets() # GetSubDatasets函数返回一个元组列表
print('Number of subdatasets: {}'.format(len(subdatasets)))
for sd in subdatasets:
    print('Name: {0}\nDescription:{1}\n'.format(*sd))


# 打开Modis文件中的第一个子数据集:[0][0]
# 第五个数据集为: [4][0]
ndvi_ds = gdal.Open(subdatasets[0][0])

# 通过打印尺寸来确保正常工作
print('Dataset dimensions: {} {}'.format(ndvi_ds.RasterXSize, ndvi_ds.RasterYSize))

# 读取数据之前先获取波段
ndvi_band = ndvi_ds.GetRasterBand(1)
print('Band dimensions: {} {}'.format(ndvi_band.XSize, ndvi_band.YSize))

Os resultados mostram que:

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/amyniez/article/details/114632670
Recomendado
Clasificación