基於python實現遙感影像預覽圖生成

目的

遙感影像通常無法直接查看,還需要經過專業軟件打開,才能看到其具體內容。最近,需要開發對遙感影像直接生成預覽圖,就使用GDAL提取波段信息,通過opencv寫入圖片

環境

  • python3.5
  • gdal2.4.1
  • opencv-python

代碼

 

from osgeo import gdal
import cv2
import numpy as np

np.seterr(divide='ignore', invalid='ignore')


def create_preview(dataset, target_path, red=1, green=2, blue=3):
    """
    生成遙感影像的預覽圖
    :param dataset: 影像數據
    :param red: 預覽圖紅色採用影像的波段索引
    :param green: 預覽圖綠色採用影像的波段索引
    :param blue: 預覽圖藍色採用影像的波段索引
    :param target_path: 預覽圖存儲地址
    :return:
    """
    band_count = dataset.RasterCount
    cols = dataset.RasterXSize  # 列數
    rows = dataset.RasterYSize  # 行數
    # 多波段影像根據紅綠藍索引合成圖片
    if band_count >= 3:
        band_red = dataset.GetRasterBand(red)
        data_red = translate(band_red, cols, rows)
        band_green = dataset.GetRasterBand(green)
        data_green = translate(band_green, cols, rows)
        band_blue = dataset.GetRasterBand(blue)
        data_blue = translate(band_blue, cols, rows)

        x = np.zeros([rows, cols, 3], dtype=np.uint8)
        for row_index in range(rows):
            for col_index in range(cols):
                x[row_index][col_index][0] = data_red[row_index][col_index]
                x[row_index][col_index][1] = data_green[row_index][col_index]
                x[row_index][col_index][2] = data_blue[row_index][col_index]
        cv2.imwrite(target_path, x)
    # 單波段影像直接合成灰度
    else:
        band = dataset.GetRasterBand(1)
        cv2.imwrite(target_path, translate(band, cols, rows))


def translate(band, cols, rows):
    """將一個波段的值轉到0-255的區間"""
    band_data = band.ReadAsArray(0, 0, cols, rows)
    min = band.GetMinimum()
    max = band.GetMaximum()
    nodata = band.GetNoDataValue()
    band_data[band_data == nodata] = min
    band_data = band_data / max * 255
    return band_data.astype(np.uint8)


driver = gdal.GetDriverByName('GTiff')
# 多波段影像
dataset = gdal.Open("E:/商丘yx/t50smc_20181101t025839_b01.img")
target_path = "C:\\Users\\Administrator\\Pictures\\test_copy1.png"
create_preview(dataset, target_path, red=8, green=5, blue=4)

結果

選擇的波段可能不太適合,生成的顏色偏暗

 

結果預覽

存在問題

  • 多波段影像效率低
  • 生成的預覽圖太大
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章