iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
Software Development

AI Model with GIS系列 第 5

[Day 5] Python with Rasterio

  • 分享至 

  • xImage
  •  

既然昨天我們拿了真實的衛星資料並丟入 SNAP 且成功拿到一張還不錯的衛星照(昨天確認後是桃園機場),今天我們就要來用 Python 自動化抓取我們資料並給出該圖像的資訊,未來組成一個 Workflow。

Rasterio

我先來簡單介紹一下 Rasterio,他就是一個專門處理帶有地理座標的影像 (GeoTIFF),它裡面帶有 GDAL (地理資料抽象函式庫),讓我們可以用簡單的 Python code 就把衛星圖讀成 Numpy 矩陣,同時也能知道在地球上的哪個位置(座標系統、CRS、經緯度邊界),讓我們未來方便串接 YOLO。

今日困境

我一開始是用 matplotlib 直接開 .tif 檔的照片,但開啟時非常的亮,幾乎看不到陸地(像閃光彈),查了一下才知道這個衛星是 16-bit (0-6535) 的,但一般套件只能看 0-255 ,所以剛 show 照片才會直接亮炸。

Problem 1.

為了讓牠不要那麼亮我把數值除以一個固定的參數,再把超過的範圍值切掉,彈出來的效果是非常暗,幾乎連雲都看不到,但我發現一個錯誤,圖片切下來通常不是完美正方形,所以當影像邊界是 No Data 的時候他們在矩陣的數值是 0,所以我讓它去算最暗的 2% 是多少的時候會把這些無效邊界算進去,導致最小值跑掉,讓影像變超黑。

Problem 2.

還有一個是原本我直接把紅綠藍三個矩陣混在一起算最小值,但其實影響還是有除了紅綠藍的波段,他們的反光程度不一樣(地表或雲層),如果混在一起算會被壓成純黑,然後雲層那部分因為過曝所以變成紅黃色。

操作建議

所以根據以上問題我們就知道我們需要做甚麼,首先我們必須要要把紅綠藍獨立分開來算,然後排除 No Data 的邊界,我找到了一個動態直方圖拉伸 (Percentile Stretch) 的方法。

首先波段處理的部分我們需要用迴圈把紅綠藍分開,一個個處理,再來過濾掉無效的波段,可以用以下程式碼:

valid_pixels = band[band > 0]

再來我們用 Numpy 計算百分位數,我是取 2% ~ 98% 作為極端值,但因為我這張影像雲有點太多,所以我調成 2% ~ 90%,這樣切換之後就清楚也正常多了。

小結

總之今天我們嘗試用 code 處理影像的資訊,搭配RasterioNumpymatplotlib 來實現以上功能(包括但不限於影像像素、波段數量、影像地理資訊等等),在未來我可能把這些影像做一下處理,相信很快資料集收集完、做完資料處理,我們就可以跳到 YOLO 與 PyTroch 的部分了,那我們明天見。


上一篇
[Day 4] Deal with my Dataset
系列文
AI Model with GIS5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言