cada blog, cada lema: La respuesta más corta está haciendo.
0. Prefacio
Comparación de diferentes métodos para leer imágenes de teledetección de alta resolución. La imagen de alta resolución utilizada en el experimento contiene 4 bandas: bandas R, G, B, Nir (infrarrojo cercano)
1. Texto
El principal método de comparación: leer imágenes de alta puntuación (256, 256, 4), obtener cada canal (256, 256) por separado, tomar un valor único para cada canal (np.unique ()) y finalmente imprimir el frente del valor único de cada canal 10 para la comparación.
1.1 Código compartido
Importar paquete
import cv2 as cv
import numpy as np
import gdal
from PIL import Image
path = r'./data/input/000001.tif'
Imprima el valor en cada canal de la matriz tridimensional (256, 256, 4)
def print_result(arr, name):
""" 对三维数组(256,256,4)的每个通道进行打印前10个唯一值
:param arr: 三维数组
:param name: 使用的方法名
:return:
"""
ch1 = arr[:, :, 0]
ch2 = arr[:, :, 1]
ch3 = arr[:, :, 2]
ch4 = arr[:, :, 3]
print(ch1.shape)
print('{} unqiue 1:'.format(name), np.unique(ch1)[:10])
print('{} unqiue 2:'.format(name), np.unique(ch2)[:10])
print('{} unqiue 3:'.format(name), np.unique(ch3)[:10])
print('{} unqiue 4:'.format(name), np.unique(ch4)[:10])
1.2 opencv
1.2.1 Código
def cv_load():
arr = cv.imread(path, cv.IMREAD_UNCHANGED)
print_result(arr, 'cv')
cv_load()
1.2.2 Resultados
1.3 PIL
1.3.1 Código
def Image_load():
img = Image.open(path)
arr = np.array(img)
print_result(arr, 'Image')
Image_load()
1.3.2 Resultados
1.4 gdal método uno
1.4.1 Código
def gdal_load_img():
dataset = gdal.Open(path)
arr = dataset.ReadAsArray()
arr = arr.reshape((256, 256, 4))
print_result(arr, 'gdal')
gdal_load_img()
1.4.2 Resultados
1.5 gdal método dos
1.5.1 Código
def gdal_load2():
dataset = gdal.Open(path)
bands = dataset.RasterCount
for band in range(1, bands + 1):
# print(band)
# 读取波段
src_band = dataset.GetRasterBand(band)
# 波段转数组
band_arr = src_band.ReadAsArray()
if band == 1:
height = band_arr.shape[0]
width = band_arr.shape[1]
arr = np.zeros((height, width, bands), dtype=np.uint8)
arr[:, :, band - 1] = band_arr
# ------------------
# 查看结果
print_result(arr, 'gdal2')
gdal_load2()
1.5.2 Resultados
1.6 Resumen
El resultado general:
- PIL y el segundo método de gdal tienen el mismo resultado
- El último canal de opencv es el mismo que el último canal de los dos resultados mencionados anteriormente
- ¿Por qué los resultados son diferentes después de leer la misma imagen? Este punto por resolver