すべてのブログすべてのモットー:最短の答えはやっています。
0.まえがき
高解像度リモートセンシング画像を読み取るためのさまざまな方法の比較実験で使用された高解像度画像には、R、G、B、Nir(近赤外線)バンドの4つのバンドが含まれています
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'
3次元配列(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.4gdalメソッド1
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.5gdalメソッド2
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まとめ
全体的な結果:
- PILとgdalの2番目の方法は同じ結果になります
- opencvの最後のチャネルは、上記の2つの結果の最後のチャネルと同じです。
- 同じ写真を読んだ後、結果が異なるのはなぜですか?解決すべきこの点