Python批次繪製遙感影像資料的直方圖

瘋狂學習GIS發表於2023-02-27

  本文介紹基於Pythongdal模組,實現對大量柵格影像批次繪製直方圖的方法。

  首先,明確一下本文需要實現的需求:現需對多幅柵格資料檔案進行依據其像元數值的直方圖繪製,具體繪製內容即各柵格影像畫素數值的分佈情況;所有柵格資料都儲存在同一目標路徑下,且均為.tif格式;而目標路徑下具有其它非.tif格式的檔案,以及不需要進行直方圖繪製的.tif格式檔案,因此需要在繪製前對目標路徑下的檔案列表加以篩選,只保留需要繪製直方圖的柵格檔案。

  知道了需求,我們便開始程式碼的書寫。具體程式碼如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 20 12:17:05 2021

@author: fkxxgis
"""

import os
import numpy as np
import matplotlib.pyplot as plt
from osgeo import gdal

lai_file_path="G:/Postgraduate/LAI_Glass_RTlab/LAI_Difference_Global/"
pic_save_path="G:/Postgraduate/LAI_Glass_RTlab/LAI_histogram.png"

file_list=os.listdir(lai_file_path)
tif_list=[]
for file in file_list:
    if os.path.splitext(file)[1]==".tif":
        if file[0:3]!="MCD":
            tif_list.append(file)

sub_plot_num=1
for tif in tif_list:
    lai_algorithm=tif[0:3]
    print(lai_algorithm)
    lai_raster=gdal.Open(lai_file_path+tif)
    lai_raster_array=lai_raster.ReadAsArray()
    plt.subplot(2,2,sub_plot_num)
    plt.hist(lai_raster_array)
    sub_plot_num=sub_plot_num+1
plt.show()
plt.savefig(pic_save_path, dpi=300)

  其中,lai_file_path為待處理柵格圖層存放的路徑,pic_save_path為後期程式得到直方圖的儲存路徑。

  首先,藉助os.listdir()函式獲取lai_file_path路徑下的全部檔案,此時獲取的檔案包括需要的.tif格式檔案與其它不需要的檔案;其次,透過os.path.splitext()函式將上述列表中的每一個檔案file的檔名與檔案擴充名分離,並選擇".tif"進行處理;這一步是避免誤將lai_file_path路徑中非.tif格式檔案一併選擇。

  隨後,還需要將我們不需要的.tif柵格影像透過檔名篩選的方式去除。在這裡,由於不需要繪圖的.tif檔案均以MCD開頭,因此直接透過字串擷取的方式將其加以剔除即可;大家在上述程式碼的實際運用過程中按照個人需求進行篩選即可。

  接下來,開始直方圖的繪製。在這裡我選擇了將幾幅直方圖以子圖的形式繪製在一個總圖中,因此需要藉助sub_plot_num進行迴圈;隨後,對篩選後的圖層進行讀取,並將柵格資料轉換為Array形式,這一部分具體可以參考文章Python GDAL讀取柵格資料並基於質量評估波段QA對指定資料加以篩選掩膜,本文就不再贅述;最後,利用plt.hist()函式進行直方圖的繪製即可。

  最後,透過plt.savefig(pic_save_path, dpi=300)這句程式碼,將設定了影像清晰度的繪圖結果儲存在指定路徑,從而大功告成。

相關文章