目的
遙感影像通常無法直接查看,還需要經過專業軟件打開,才能看到其具體內容。最近,需要開發對遙感影像直接生成預覽圖,就使用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)
結果
選擇的波段可能不太適合,生成的顏色偏暗
結果預覽
存在問題
- 多波段影像效率低
- 生成的預覽圖太大