[Python] Opencv, PIL, gdal leen comparación de imágenes de detección remota de alta resolución

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

1.6 Resumen

El resultado general:
Inserte la descripción de la imagen aquí

  1. PIL y el segundo método de gdal tienen el mismo resultado
  2. El último canal de opencv es el mismo que el último canal de los dos resultados mencionados anteriormente
  3. ¿Por qué los resultados son diferentes después de leer la misma imagen? Este punto por resolver

Supongo que te gusta

Origin blog.csdn.net/weixin_39190382/article/details/113745925
Recomendado
Clasificación