【Python&RS】基於GDAL遙感影像分幅裁剪(固定尺寸)

RS迷途小书童發表於2024-04-06

之前分享過一篇分幅裁剪的文章:【Python&RS】基於GDAL遙感影像分幅裁剪,只不過這篇文章當時編寫的邏輯是自己輸入需要裁剪多少行多少列,由於大家可能並沒有直觀地希望自己裁剪多少行列,所以非常侷限。今天跟大家分享一下使用固定尺寸對遙感影像進行分幅裁剪,即每張裁剪的影像都是一樣大的。

原創作者:RS迷途小書童

部落格地址:https://blog.csdn.net/m0_56729804?type=blog

1. 程式碼邏輯

邏輯其實很簡單,就是利用輸入的尺寸計算出需要裁剪多少行多少列。然後按照之前文章的方法進行裁剪即可。當然這裡要注意一下邊緣處的處理。

2. 程式碼主函式

由於和之前發的文章原理差不多,所以我這裡就不做過多的解釋了,程式碼中都有詳細的註釋,如果大家有什麼問題可以給我留言。

ds = gdal.Open(filepath)  
ds_width = ds.RasterXSize  
ds_height = ds.RasterYSize  
ds_bands = ds.RasterCount 
raw = int(ds_height / size) + 1
col = int(ds_width / size) + 1
for j in range(0, raw):
    print("正在裁剪第%s行......" % (j + 1))
    for k in range(0, col):
        raw_frame = size
        col_frame = size
        left_x = j * raw_frame
        left_y = k * col_frame
        raw_frame = min(ds_height-left_x, raw_frame)
        col_frame = min(ds_width-left_y, col_frame)
        driver = gdal.GetDriverByName('GTiff')
        ds_result = driver.Create(out_path+"%s_%s.tif" % (j+1, k+1), col_frame, raw_frame,
                                  bands=ds_bands, eType=gdal.GDT_Byte)
        ds_geo = ds.GetGeoTransform()
        top_left_x = ds_geo[0] 
        top_left_y = ds_geo[3]  
        top_left_x = top_left_x + left_y * ds_geo[1]
        top_left_y = top_left_y + left_x * ds_geo[5]
        ds_geo = (top_left_x, ds_geo[1], ds_geo[2], top_left_y, ds_geo[4], ds_geo[5])
        ds_result.SetGeoTransform(ds_geo)
        ds_result.SetProjection(ds.GetProjection())
        array_band = []
        for i in range(1, ds_bands+1):
            array_band = ds.GetRasterBand(i).ReadAsArray(left_y, left_x, col_frame, raw_frame).astype(np.float64)
            # 根據左上角的畫素座標和幅寬讀取指定區域內的資料
            ds_result.GetRasterBand(i).SetNoDataValue(0)  # 將無效值設為0
            ds_result.GetRasterBand(i).WriteArray(array_band)  # 將每個波段寫入新的檔案中
        ds_result = None
        del ds_result

3. 總結

今天主要分享的是遙感影像的分幅裁剪,大家可以用這段程式碼減少資料量,也可以用它製作樣本集。同時結合之前發的那篇分幅裁剪的文章,基本上概括了所有的分幅裁剪的情況,友友們也可以根據自己的需求修改一下程式碼。如果大家在學習Python或者RS時有什麼問題,可以隨時留言交流!如果大家對批次處理有興趣同樣可以留言給博主,博主會分享相關程式碼以供學習!

相關文章