目的
遥感影像通常无法直接查看,还需要经过专业软件打开,才能看到其具体内容。最近,需要开发对遥感影像直接生成预览图,就使用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)
结果
选择的波段可能不太适合,生成的颜色偏暗
结果预览
存在问题
- 多波段影像效率低
- 生成的预览图太大