参考:http://gdal.org/python/
1、方法一
import numpy as np
import os
import gdal
import sys
'''
# 多波段图像(遥感图像)提取每个波段信息转换成数组(波段数>=4 或者 波段数<=3)
# 一般的方法如:opencv,PIL,skimage 最多只能读取3个波段
# path 图像的路径
# return: 图像数组
'''
def Multiband2Array(path):
src_ds = gdal.Open(path)
if src_ds is None:
print('Unable to open %s'% path)
sys.exit(1)
xcount=src_ds.RasterXSize
ycount=src_ds.RasterYSize
ibands=src_ds.RasterCount
for band in range(ibands):
band += 1
srcband = src_ds.GetRasterBand(band)
if srcband is None:
continue
dataraster = srcband.ReadAsArray(0, 0, xcount, ycount).astype(np.float32)
if band==1:
data=dataraster.reshape((ycount,xcount,1))
else:
data=np.append(data,dataraster.reshape((ycount,xcount,1)),axis=2)
src_ds=None
return data
if __name__=="__main__":
cwd = os.getcwd()
path = os.path.join(cwd, '10.tif')
path=r"F:\PL\2_1.tif"
img=Multiband2Array(path)
print(img.shape)
img_raw = img.tobytes()
pass
2、方法二
import cv2
import numpy as np
from osgeo import gdal
filename="D:/cloud.tif"
ds = gdal.Open(filename)
data = ds.ReadAsArray()
c,h,w=data.shape
raster_fn="_mask.tif"
target_ds = gdal.GetDriverByName('GTiff').Create(raster_fn, w, h, c, gdal.GDT_Byte)
target_ds.WriteRaster(0,0,w,h,data.tobytes())
target_ds.FlushCache()
ds=None
target_ds=None
3、补充
data = ds.ReadAsArray()
data=ds.ReadRaster(0, 0, xcount2, ycount2)
data= np.fromstring(data, np.uint8)
data = np.reshape(data, [ycount2, xcount2]).astype(data_type)
srcband = src_ds.GetRasterBand(band)
data=srcband.ReadAsArray(0, 0, xcount2, ycount2).astype(data_type)
G2 = srcband.ReadRaster(0, 0, xcount2, ycount2)
G2 = np.fromstring(G2, np.uint8)
G2 = np.reshape(G2, [ycount2, xcount2]).astype(data_type)
target_ds.WriteRaster(0,0,w,h,data.tobytes())
target_ds.GetRasterBand(1).WriteArray(img, 0, 0)
target_ds.GetRasterBand(1).WriteRaster(0,0,xcount1,ycount1,img.tobytes())