使用GDAL包可以進行遙感圖的處理,使用ENVI工具可以方便查看遙感圖像
分割遙感圖,保存成tif格式的,代碼如下:
# -*- coding: utf-8 -*-
import os
import numpy
from osgeo import gdal
class GRID:
# 讀圖像文件
def read_img(self, filename):
dataset = gdal.Open(filename) # 打開文件
im_width = dataset.RasterXSize # 柵格矩陣的列數
im_height = dataset.RasterYSize # 柵格矩陣的行數
im_geotrans = dataset.GetGeoTransform() # 仿射矩陣
im_proj = dataset.GetProjection() # 地圖投影信息
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) # 將數據寫成數組,對應柵格矩陣
del dataset
return im_proj, im_geotrans, im_data
# 寫文件,以寫成tif爲例
def write_img(self, filename, im_proj, im_geotrans, im_data):
# gdal數據類型包括
# gdal.GDT_Byte,
# gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
# gdal.GDT_Float32, gdal.GDT_Float64
# 判斷柵格數據的數據類型
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
# 判讀數組維數
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1, im_data.shape
# 創建文件
driver = gdal.GetDriverByName("GTiff") # 數據類型必須有,因爲要計算需要多大內存空間
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
dataset.SetGeoTransform(im_geotrans) # 寫入仿射變換參數
dataset.SetProjection(im_proj) # 寫入投影
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) # 寫入數組數據
else:
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
if __name__ == "__main__":
# os.chdir(r'E:/data') # 切換路徑到待處理圖像所在文件夾
proj, geotrans, data = GRID().read_img('D:/Image/NECAS/20200203/Ortho/Ortho.tif') # 讀數據
print(proj)
print(geotrans)
# print(data)
print(data.shape)
channel, width, height = data.shape
print(width, height)
for i in range(width // 4000): # 切割成4000*3000小圖
for j in range(height // 3000):
cur_image = data[:, i * 4000:(i + 1) * 4000, j * 3000:(j + 1) * 3000]
# driver = gdal.GetDriverByName('JPEG')
# dst_ds = driver.CreateCopy('D:/Image/NECAS/20200203/cut2/{}_{}.jpg'.format(i, j), cur_image)
GRID().write_img('D:/Image/NECAS/20200203/cut/{}_{}.tif'.format(i, j), proj, geotrans, cur_image) ##寫數據
將遙感圖分割後,保存成jpg格式的,代碼如下:
# -*- coding: utf-8 -*-
import os
import numpy as np
from osgeo import gdal
import cv2
def readTif(fileName):
merge_img = 0
driver = gdal.GetDriverByName('GTiff')
driver.Register()
dataset = gdal.Open(fileName)
if dataset == None:
print(fileName + "掩膜失敗,文件無法打開")
return
im_width = dataset.RasterXSize # 柵格矩陣的列數
print('im_width:', im_width)
im_height = dataset.RasterYSize # 柵格矩陣的行數
print('im_height:', im_height)
im_bands = dataset.RasterCount # 波段數
im_geotrans = dataset.GetGeoTransform() # 獲取仿射矩陣信息
im_proj = dataset.GetProjection() # 獲取投影信息
print(im_bands)
if im_bands == 1:
band = dataset.GetRasterBand(1)
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) # 獲取數據
cdata = im_data.astype(np.uint8)
merge_img = cv2.merge([cdata, cdata, cdata])
cv2.imwrite('C:/Users/summer/Desktop/a.jpg', merge_img)
#
elif im_bands == 4:
band1=dataset.GetRasterBand(1)
band2=dataset.GetRasterBand(2)
band3=dataset.GetRasterBand(3)
band4=dataset.GetRasterBand(4)
for i in range(im_width // 4000): # 切割成4000*3000小圖
for j in range(im_height // 3000):
data1 = band1.ReadAsArray(i * 4000, j * 3000, 4000,3000).astype(np.uint8) # r #獲取數據
data2 = band2.ReadAsArray(i * 4000, j * 3000, 4000,3000).astype(np.uint8) # g #獲取數據
data3 = band3.ReadAsArray(i * 4000, j * 3000, 4000,3000).astype(np.uint8) # b #獲取數據
data4 = band4.ReadAsArray(i * 4000, j * 3000, 4000,3000).astype(np.uint8) # R #獲取數據
# print(data1[1][45])
output1= cv2.convertScaleAbs(data1)#alpha=(255.0/65535.0)
# print(output1[1][45])
output2= cv2.convertScaleAbs(data2)
output3= cv2.convertScaleAbs(data3)
merge_img1 = cv2.merge([output3, output2, output1]) # B G R
cv2.imwrite('D:/Image/NECAS/20200203/cut2/{}_{}.jpg'.format(i, j), merge_img1)
print("success")
if __name__=='__main__':
readTif("D:/Image/NECAS/20200203/Ortho/Ortho.tif")
print ("0k")
詳細怎麼使用GDAL 自行百度。
參考鏈接:http://www.dengb.com/Pythonjc/1318700.html
https://www.osgeo.cn/pygis/gdal-gdalreadata.html
https://blog.csdn.net/xiaoli_nu/article/details/94064529