本文介紹基於Python中gdal
模組,實現對大量柵格影像批次繪製直方圖的方法。
首先,明確一下本文需要實現的需求:現需對多幅柵格資料檔案進行依據其像元數值的直方圖繪製,具體繪製內容即各柵格影像畫素數值的分佈情況;所有柵格資料都儲存在同一目標路徑下,且均為.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)
這句程式碼,將設定了影像清晰度的繪圖結果儲存在指定路徑,從而大功告成。