遙感圖切割

使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章