【python】opencv、PIL、gdal读取高分遥感影像比较

every blog every motto: The shortest answer is doing.

0. 前言

不同方法读取高分遥感影像的比较,实验所用高分影像含有4个波段:R、G、B、Nir(近红外)波段

1. 正文

比较的主要方法:读取高分影像(256,256,4),分别获取每个通道(256,256),对每个通道取唯一值(np.unique()),最后,打印每个通道唯一值的前10个进行比较。

1.1 共用代码

导入包

import cv2 as  cv
import numpy as np
import gdal
from PIL import Image

path = r'./data/input/000001.tif'

打印三维数组(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 代码

def cv_load():
    arr = cv.imread(path, cv.IMREAD_UNCHANGED)
    print_result(arr, 'cv')
    
cv_load()

1.2.2 结果

在这里插入图片描述

1.3 PIL

1.3.1 代码

def Image_load():
    img = Image.open(path)
    arr = np.array(img)
    print_result(arr, 'Image')
   
Image_load()

1.3.2 结果

在这里插入图片描述

1.4 gdal 方法一

1.4.1 代码

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 结果

在这里插入图片描述

1.5 gdal 方法二

1.5.1 代码

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 结果

在这里插入图片描述

1.6 小结

总的结果:
在这里插入图片描述

  1. PIL 和 gdal的第二种方法 结果一样
  2. opencv 的最后一个通道 和上面提到的两种结果的最后一个通道结果一样
  3. 同一张图片,为什么读取后的结果不同?此点待解

猜你喜欢

转载自blog.csdn.net/weixin_39190382/article/details/113745925