看小伙是如何用python盡覽我國植被🌳覆寫率的滄海變化
- 前言
- 一、柵格資料轉為灰度圖
- 二、灰度圖轉為偽彩色圖
- 三、合成為gif
- 寫在最后
前言
昨天學弟給了我一個資料包“我國NDVI的柵格資料”(即歸一化植被指數),需要把陜西省的資料批量裁剪出來,
于是,我拿出python,“刷刷刷~”,搞定了:

這就完事了? 作為深度踐行勤儉節約的社會主義好青年的kimol君,當然不會浪費資源,于是,我決定用這個資料來分析一下我國植被覆寫率變化的滄海桑田(以陜西省為例),
先上圖,讓大家伙一睹為快:

可以很直觀地看出,從1998-2018年,陜西省(尤其是陜北地區)的植被覆寫率正在不斷增加,我想,這離不開國家治沙工程的大力推行,更離不開許許多多護林治沙先輩們的辛勤付出~(手動敬禮中…)
一、柵格資料轉為灰度圖
本次用到的資料是NDVI柵格資料,它是以“.tif”為后綴的,簡單來理解的話,我們可以把它看作一張圖,每個像素點的值代表了該位置的歸一化植被指數,為了更方便展示,我們將其轉為灰度圖:
首先讀取tif資料:
def transfer(img):
'''
將tif轉為灰度圖
'''
for x in range(img.shape[0]):
for y in range(img.shape[1]):
if img[x][y] < 0:
img[x][y] = 0
else:
img[x][y] *= 255
return img
# 創建檔案夾用于存盤灰度圖
grayPath = './gray'
if not os.path.exists(grayPath):
os.mkdir(grayPath)
# 遍歷tif檔案
tifPath ='./data'
for file in os.listdir(tifPath):
if file.endswith('.tif'):
img = cv2.imread('%s/%s'%(tifPath, file), 2)
transfer(img) # 轉為灰度格式
cv2.putText(img,'Year %s'%file[9:13], (20,40), cv2.FONT_HERSHEY_SIMPLEX, 1.0,(255,255,255), 1, cv2.LINE_AA) # 加入年份說明
cv2.imwrite('%s/%s.png'%(grayPath, file.split('.')[0]), img)
print('"%s"處理完畢!'%file)
其中cv2.putText是為了在圖片上加入年份,方便區分,最后得到灰度圖如下:

然而,灰度圖似乎顯得不太友好,為了更直觀地表現出植被覆寫率,我決定將其轉為“偽彩色”,
二、灰度圖轉為偽彩色圖
我們根據像素點的灰度值來定義三個顏色區間(紅、黃、綠),并進行轉換:
def trans_color(img):
'''
將灰度圖轉為偽彩色
'''
for x in range(img.shape[0]):
for y in range(img.shape[1]):
if img[x][y][0] == 0 and img[x][y][1] == 0 and img[x][y][2] == 0: # 邊緣區域跳過
continue
gray = img[x][y][0]
if gray <= 110: # 紅
img[x][y][0] = 0
img[x][y][1] = gray*1.5
img[x][y][2] = 255
elif gray <= 200: # 黃
gray -= 85
img[x][y][0] = 0
img[x][y][1] = 255
img[x][y][2] = 255-(127*gray/85)
else: # 綠
gray -= 170
img[x][y][0] = 0
img[x][y][1] = 255
img[x][y][2] = 127-(127*gray/85)
return img
需要注意的是,cv2.imread默認讀取的模式并非RGB而是BRG,
遍歷灰度圖片,并轉換:
# 創建檔案夾用于存盤彩色圖
rgbPath = './rgb'
if not os.path.exists(rgbPath):
os.mkdir(rgbPath)
# 將灰度圖轉為彩色圖
for file in os.listdir(grayPath):
img = cv2.imread('%s/%s'%(grayPath, file))
trans_color(img) # 轉換
cv2.imwrite('%s/%s'%(rgbPath, file), img)
print('"%s"轉換完畢!'%file)
于是,我們得到了彩色的圖片:

三、合成為gif
利用imageio庫,將眾多圖片合成為一張gif圖:
def create_gif(image_list, gif_name, duration=0.35):
'''
生成gif
'''
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
imageio.mimsave(gif_name, frames, 'GIF', duration=duration)
return
# 合成gif圖
images_list = []
for file in os.listdir(rgbPath):
images_list.append('%s/%s'%(rgbPath, file))
create_gif(images_list, 'NDVI.gif')
于是,我們便有了前言中的那張圖,收工~
寫在最后
先輩們用堅毅的品質告訴了我們什么叫敢為人先;
先輩們用辛勤的汗水告訴了我們什么叫持之以恒;
先輩們用喜人的成果告訴了我們什么叫銳意進取,
我輩又有何種理由不奮進呢?
我是kimol君,咋們下次再會~

創作不易,大俠請留步… 動起可愛的雙手,來個贊再走唄 (???←?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258740.html
標籤:python
上一篇:Python的yield關鍵字
下一篇:網站優化圖片alt問題
