2022年10月16日 星期日

用matplotlib畫衛星雲圖

用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy

使用viridis這個色階畫出來長這樣。

2022年10月9日 星期日

色調強化衛星雲圖

色調強化雲圖簡單的來說,就是將紅外線雲圖依照溫度填上不同的顏色。

首先,必須有一張對照表,定義個溫度區間所要使用的顏色,然後再查表,找出資料灰度值所代表的溫度,我使用的高知大學提供的向日葵8號衛星資料,附一個對照表,依照需求整理成下表。

依照表格,可以利用for迴圈把每一個格點的顏色填入。
from PIL import Image
import numpy as np
import pyresample as pr
from pycoast import ContourWriterAGG
import aggdraw
Source_def = pr.load_area('Table/Projection.proj','KoChi_1800') # 原始FDK資料的投影
Image_def = pr.load_area('Table/Projection.proj','LCC_1000')  # 輸出圖檔的投影
PGMIR1='HMW822090416IR1.pgm'
cntS = np.fromfile(PGMIR1,dtype='uint8')
dsize=1800
arraysize=dsize*dsize
cntS = cntS[-arraysize:]
cntS = cntS.reshape((dsize,dsize))
RoI = 5000 # 取樣之影響半徑
Cnt = pr.kd_tree.resample_nearest(Source_def, cntS, Image_def, radius_of_influence=RoI)

xs = Cnt.shape[0]
ys = Cnt.shape[1]
cntRGB = np.zeros((xs,ys,3),dtype=np.uint8)
for x in range(xs) :
 for y in range(ys) :
  if Cnt[y,x] > 249 : # -90. :
     cntRGB[y,x,:] = [255,255,255]
  elif Cnt[y,x] >243 : #-80. :
     cntRGB[y,x,:] = [255,70,255]
  elif Cnt[y,x] >237 : # -70. :
     cntRGB[y,x,:] = [255,0,255]
  elif Cnt[y,x] > 230 : # -60. :
     cntRGB[y,x,:] = [0,200,200]
  elif Cnt[y,x] > 211 : #< -40. :
     cntRGB[y,x,:] = [0,0,0]
  elif Cnt[y,x] > 184 : # -20. :
     cntRGB[y,x,:] = [200,155,0]
  elif Cnt[y,x] > 149 : # 0. :
     cntRGB[y,x,:] = [0,145,0]
  elif Cnt[y,x] > 105: # 20. :
     cntRGB[y,x,:] = [0,40,255]
  else :
     cntRGB[y,x,:] = [0,40,200]

Img_new = Image.fromarray(cntRGB,'RGB')
ShapePath = 'Table/gshhg-shp-2.3.7'
cw = ContourWriterAGG(ShapePath)
cw.add_coastlines(Img_new,Image_def,resolution='l',outline=(255,0,0),width=2)
ttfFile = 'Table/LiberationMono-Regular.ttf'
font = aggdraw.Font('white',ttfFile)
cw.add_grid(Img_new,Image_def,(20,20),(10,10),font,outline=(0,0,255),width=3)
Img_new.show()
Img_new.save('LCC_Enhance.png')

2022年10月2日 星期日

再為雲圖上加上海岸線和經緯度線

延續前一篇文章,使用pyresample轉換了衛星雲圖的投影。接下來要在圖上加上海岸線和經緯線。

from PIL import Image
import numpy as np
import pyresample as pr
from pycoast import ContourWriterAGG
import aggdraw
Source_def = pr.load_area('Table/Projection.proj','KoChi_1800') # 原始FDK資料的投影
Image_def = pr.load_area('Table/Projection.proj','LCC_1000')  # 輸出圖檔的投影
PGMIR1='HMW822090416IR1.pgm'
cntS = np.fromfile(PGMIR1,dtype='uint8')
dsize=1800
arraysize=dsize*dsize
cntS = cntS[-arraysize:]
cntS = cntS.reshape((dsize,dsize))
RoI = 5000 # 取樣之影響半徑
Cnt = pr.kd_tree.resample_nearest(Source_def, cntS, Image_def, radius_of_influence=RoI)
Img = Image.fromarray(Cnt,'L')
Img_new=Img.convert('RGB') #把灰階的Img轉換成RGB的Img_new

前面這些程式碼先把要輸出的圖準備好,注意,要把圖轉換成RBG的格式,否則海岸線和經緯線也會是黑白的。

用matplotlib畫衛星雲圖

用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy 使用viridis這個色階畫出來長這樣。