02-Sentinel-2 L1C級數據bat和Python腳本批量大氣校正


(原創文章,轉載請註明來源,謝謝!)

前言

本文爲《SNAP與snappy》專欄第2篇博文。儘管2018年後期後開始,歐空局提供了全球範圍的Sentinel-2 L2A級產品,但是在此之前Sentinel-2 L2A的數據只有歐洲範圍區域纔有L2A級產品。此外,博主發現歐空局似乎不會將雲量比較大(Sentinel-2 成像自帶檢測雲量的算法)的L1C處理成L2A級產品,儘管多數情況下,我們的確不需要雲量過量的產品。另外,之前,看到中科院遙感衛星地面站陳甫同志的一篇文章,提到歐空局發佈的Sentinlel-2 L2A級產品可能存在一些問題,至於是不是這樣,很難判斷。不管怎樣,使用Sentinel-2數據還是有必要知道一下L2A產品的生成方法。

Sentinel-2 L1C數據大氣校正方法

Sentinel- 2L1C級數據是歐空局直接提供給我們可以下載的數據。其大氣校正用的大多數是歐空局自身提供的開源大氣校正插件Sen2Cor,它是Sentinel-2 L2A產品生成和格式化處理器。

Sen2cor對Sentinel-2 L1C級大氣輸入數據進行大氣、地形和捲雲校正。Sen2Cor創建底部大氣,可選地形和捲雲校正反射圖像;此外,還會創建氣溶膠光學厚度,水汽,場景分類地圖和帶有質量指標性質的雲和雪概率掩膜圖像。其輸出的產品格式和L1C級用戶產品格式相同:JPEG 2000格式圖像,三種不同的分辨率,60、20和10 m。

在大氣校正前,希望你一些能對Sentinel-2 L1C數據有些基本認識:
Sentinel-2 L1C級產品標準產品覆蓋範圍爲100平方公里,爲經過UTM/WGS84投影正射影像組成。L1C級產品影像在正射校正時使用數字高程模型(DEM)投影至製圖座標下。其爲大氣層頂部( Top of Atmosphere , TOA)的反射率影像,不過也記錄了處理爲L1C產品每個像素的輻射測量的相關信息。L1C級產品根據不同光譜波段的分辨率,以10、20和60 m的固定地面採樣距離( Ground Sampling Distance ,GSD)重新採樣。在Level-1C產品中,像素原點是指影像的左上角。L1C級產品還將包括陸地/水、雲掩膜數據和ECMWF數據(臭氧總量、水蒸氣總量和平均海平面壓力)

關於Sentinel-2數據各個波段的介紹在網上已有較多的資料,不再過多贅述了,這裏粘貼一個:https://blog.csdn.net/qq_41718357/article/details/83536322

下面進入正題。

單個Sentinel-2 L1C數據大氣校正

關於Sentinel-2單個數據集的Sen2Cor(目前的版本爲V2.8)安裝及大氣校正教程,網上已有衆多教程資料。

L1C數據經過Sen2cor校正後的是L2A產品, L2A級產品提供了來自相關L1C級產品的大氣底部(Bottom Of Atmosphere , BOA)反射率圖像。因此,每個L2A級產品也由100平方公里的地圖幾何瓦片(UTM/WGS84投影)影像組成。

以Win10系統爲例,其它系統操作是類似的。

命令行方式調用Sen2Cor校正

Windows下的命令行方法,比較詳細的及校正方法可以參考以下文章:
松果兒 知乎專欄《Sentinel影像》----Sen2Cor (V2.8)——哨兵二號的預處理
Melody sugar知乎專欄《環境遙感學習之路》----【Sentinel-2】(2):哨兵2號數據預處理
還有上面的csdn博客。

SNAP中利用Sen2Cor插件校正

如果你不喜歡命令行方式校正的,可以添加Sen2Cor,在圖形用戶界面(GUI)進行校正。利用GUI界面進行校正可以精確地設置各種參數,但其本質還是通過調用Sen2Cor的命令行腳本L2A_Process.bat來做處理的。

Sen2cor插件安裝:

打開SNAP後,點擊Tools---->Plugins可以查看相關插件信息。
在這裏插入圖片描述
選中Available Plugins,可以看到SNAP提供的Sen2Cor插件 V2.8.0和V2.5.5。勾選前面的勾。
在這裏插入圖片描述
點擊install即可非常方便。安裝後可以在Optial---->Thematic Land Processing---->Sen2Cor Processor找到Sen2Cor V2.8.0和V2.5.5。需要用哪個就選哪個。
在這裏插入圖片描述你可能好奇,下載的插件放在哪裏了。可以再以下路徑找到它們(路徑中的紅色部分爲你的電腦用戶名):在這裏插入圖片描述
知道這個默認安裝路徑比較重要,後面需要用到這個路徑。

以Sen2Cor V2.8.0爲例,對一副Sentinel-2 L1C級數據影像進行大氣校正:
點擊I/O Parameters選擇源數據:
在這裏插入圖片描述點擊Processing Parameters可以看到衆多參數:
在這裏插入圖片描述如果你瞭解6S大氣校正方法的的話,應該能認出一些參數,這裏不會介紹具體的算法原理,也不講具體的參數設置,因爲博主這方面也是比較弱,如果你想看這些參數的意義請看幫助(Help),或者查看Sen2Cor的用戶手冊
對於我們來說,一般只需要設置分辨率這個選項就足夠了。分辨率有四種選擇,分辨率分別是10m, 20m, 60m,All。如果你選擇60m,那麼大氣校正時會將所有波段(包括高於60m的10m和20m的波段)重採樣(降採樣)爲60m的結果;如果你選擇的是20m,那麼大氣校正時會將10m和20m的波段重採樣(降採樣)爲20m,60m的分辨率保持不變;如果你選擇的是10m分辨率,原有的10m波段仍是10m波段,此外,20m和60m的波段仍然是20m和60m(如果你想看看是否這樣,建議你三個分辨率都試試看);選All的話,那個會保持原來的L1C數據分辨率(實際效果和選擇分辨率爲10m的結果差不多)。【一個規律就是原來高分辨率的影像會降採樣爲低分辨數據】。
在這裏插入圖片描述
這裏的分辨率選擇的是All,保持原有的L1C分辨率,同時勾選左上角的Display Execution output選項,下方會出現一個黑框(實際上是命令行窗口),以顯示校正過程及結果。如下圖:
在這裏插入圖片描述
點擊右下角的run,就開始大氣校正了。運行過程圖:
在這裏插入圖片描述
大氣校正耗費的時間與你的電腦配置過程有關,大概處理一個數據需要15-30分鐘。
處理完成後的示意圖:
在這裏插入圖片描述

Sentinel-2 L1C數據集批量大氣校正

好了,終於進入主題了,儘管網上也有少量的Sentinel-2
L1C級數據Sen2cor大氣校正批處理的教程,然而大多數教程,都是“淺嘗輒止”的程度,“知其然而不知其然也”!

命令行bat腳本批處理

首先,你需要知道Sen2Cor這個插件其實主要是用Python代碼(核心運算應該是C語言)寫。我們先找到L2A_Process.bat的腳本的位置(如果你是用SNAP以插件的方式安裝Sen2Cor,那麼會出現在下圖所示的路徑中,紅色部分爲你的用戶名),然後可以用記事本打開L2A_Process.bat的腳本查看它的命令。
在這裏插入圖片描述選中L2A_Process.bat,點擊鼠標右鍵,選擇編輯。

在這裏插入圖片描述可以看到bat腳本的命令(如果你不懂bat命令的話,請不要改動任何代碼,以免bat腳本出錯),我不會解釋這裏bat命令的具體意思,但是我標記了這個bat核心代碼(藍色背景文本),希望引起你的注意:
在這裏插入圖片描述
實際上,調用的L2A_Process.py文件(Python源代碼,不要改動其中的代碼)。這個代碼位於Sen2Cor文件夾Lib\site-packages\sen2cor文件夾:
在這裏插入圖片描述這個L2A_Process.py代碼也是比較複雜(反覆調用了多個python程序),博主也沒有完全弄明白,如果你弄明白的話,Please dai dai me!

低配版命令行bat腳本批處理

希望前面操作能讓你有一些感性認識。好了,進入正題。仍然以Sen2Cor V2.8.0爲例,其相關命令爲:
在這裏插入圖片描述
儘管有很多參數命令,但是執行是需要的命令極少。
一般是:L2A_Process.bat <數據集必須是.SAFE爲後綴的格式,不能是.zip>
當然在後面還可以添加額外的參數。

整個程序的邏輯非常簡單,就是找到輸入數據集中的.SAFE(L1C級數據集)然後調用L2A_Process.bat 處理該數據集。

先給出弱化版Sen2Cor_weak.bat的代碼:

@echo off
rem 設置腳本標題名爲: Sentinel-2A L1C批量大氣校正處理bat腳本
title Sentinel-2A L1C批量大氣校正處理bat腳本

rem 設置Sen2cor所在目錄變量
set "Sen2cor_bin=C:\Users\XXXXXX\.snap\auxdata\Sen2Cor-02.08.00-win64"

rem 設置數據所在目錄文件
set "input_dir=G:\test"

rem 設置輸出文件夾
set "output_dir=G:\test"

for /d  %%i in  (%input_dir%\S2*.SAFE ) do ( 
	rem 調用Sen2cor 文件對其做大氣處理
	%Sen2cor_bin%\L2A_Process.bat %%i --output_dir=%output_dir% 
	echo "-------------------------------分割線---------------------------------"
)
echo "恭喜!所有相關文件處理完成!"

我簡單解釋一下這個代碼:

  • rem命令表示該行是註釋行;
  • echo命令相當於print,顯示輸出語句;
  • set命令用於設置變量;
  • for /d %%i in (%input_dir%\S2*.SAFE)表示的是找到以S2開頭,以.SAFE後綴結尾的文件夾(/d)。
  • %Sen2cor_bin%\L2A_Process.bat %%i --output_dir=%output_dir% 是核心的處理代碼,調用L2A_Process.bat腳本處理數據集%%i,%output%表示的是輸出文件夾,這裏沒有設置分辨率參數(–resolution),你可以在這行命令加上。

要是使用上述bat腳本需要作幾個調整:

  • “Sen2cor_bin=C:\Users\XXXXXX.snap\auxdata\Sen2Cor-02.08.00-win64”(加引號的目的是爲了防止路徑有空格,命令行不能識別) 需要將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你自己Sen2Cor安裝的路徑
  • “input_dir=G:\test” 需要將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你的數據集所在路徑(注意數據集必須爲.SAFE格式)
  • “output_dir=G:\test” 如果需要,可以將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你要保存校正後的數據集所在目錄路徑

新建一個.txt文件,然後複製上述代碼命令,修改相應三個的路徑,確認無誤後,給它一個合適的名字,然後把後綴.txt改爲.bat(例如博主的Sen2Cor_weak.bat)。
再強調一次,數據集目錄下需要是.SAFE格式的文件(如果不是.SAFE文件需要自己解壓出來),否則,可能會報錯,提示找不到文件
在這裏插入圖片描述修改後bat腳本命令後,可以啓動Windows PowerShell執行Sen2Cor_weak.bat腳本或者使用命令行(cmd)執行bat腳本。
在輸入數據目錄打開Windows PowerShell:
在這裏插入圖片描述
注意,在Windows PowerShell運行bat腳本等程序需要在前面添加“.\”。成功運行的效果圖:
在這裏插入圖片描述
大概處理一個數據集需要15-30分鐘。

如果你想學習更多的bat腳本知識,在網上有衆多的教程資料,這裏粘貼一個(提前說一下,廣告比較多,但是bat的基礎內容是比較全的):
https://www.jb51.net/article/151923.htm

高配版命令行bat腳本批處理

高配版bat代碼,處理的數據集是:下載下來默認格式爲的.zip格式的Sentinel-2 L1C數據集。但是需要好壓這個壓縮軟件的支持,可以是別的解壓軟件。注意,這個程序代碼只適用於安裝有好壓這個軟件的windows系統電腦

整個程序的邏輯也是很好懂的,就是找到.zip數據集下的某個.zip文件,然後調用好壓提供的命令行工具(HaoZipC.exe)解壓生成.SAFE格式的數據,然後調用L2A_Process.bat對其做大氣校正。

@echo off
rem 設置腳本標題名爲Sentinel-2A L1C批量大氣校正處理bat腳本
title Sentinel-2A L1C批量大氣校正處理bat腳本

rem 設置好壓命令行工具所在目錄變量
set "Haozip_bin=E:\Program Files\2345Soft\HaoZip"

rem 設置Sen2cor所在目錄變量
set "Sen2cor_bin=C:\Users\lidahui\.snap\auxdata\Sen2Cor-02.08.00-win64"

rem 設置輸入文件夾
set "input_dir=G:\test"

rem 設置輸出文件夾
set "output_dir=G:\test"

for /r %input_dir% %%i in  (S2*.zip ) do (
	echo %%i
	rem 解壓文件部分
	"%Haozip_bin%\HaoZipC.exe" x -bd -o%output_dir%  %%i
	rem 換行並打印一條分割線,分隔解壓和大氣校正信息
	echo.
	echo "---------------------------------分割線------------------------------------"
	
	rem 把文件名後綴.zip換爲.SAFE(因爲Sen2cor只能識別.SAFE格式的文件夾)
	echo  %%~dpni.SAFE
	rem 調用Sen2cor 文件對其做大氣處理
	%Sen2cor_bin%\L2A_Process.bat %%~dpni.SAFE --output_dir=%output_dir%
	rem 換行並打印一條分割線,分隔解壓和大氣校正信息
	echo.
	echo "---------------------------------分割線------------------------------------"
)
echo "恭喜!所有相關文件處理完成!"

如果你裝有好壓這個軟件,可以試下上面的bat腳本。
要是使用上述bat腳本需要作幾個調整:

  • “Haozip_bin=E:\Program Files\2345Soft\HaoZip”(加引號的目的是爲了防止路徑有空格,命令行不能識別)需要將該路徑(注意最後面處沒有斜杆“\”)修改爲你安裝的好壓命令行HaoZipC.exe所在的路徑。
  • “Sen2cor_bin=C:\Users\XXXXXX.snap\auxdata\Sen2Cor-02.08.00-win64” 需要將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你自己的Sen2Cor安裝路徑
  • “input_dir=G:\test” 需要將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你的數據集所在路徑(注意這次的數據集爲.zip格式)
  • “output_dir=G:\test” 如果需要,可以將等號後面的路徑(注意最後面處沒有斜杆“\”)修改爲你要保存校正後的數據集所在目錄路徑。

博主的好壓(Haozip)軟件命令行工具(HaoZipC.exe)位於:
在這裏插入圖片描述
新建一個.txt文件,然後複製上述代碼命令,修改相應四個的路徑,確認無誤後,給它一個合適的名字,然後把後綴.txt改爲.bat(例如博主的Sen2Cor_strong.bat)。
如果你想看HaoZipC.exe的命令,可以在Windows PowerShell下執行“.\HaoZipC.exe -h”。
在這裏插入圖片描述
博主不會介紹HaoZipC.exe的相關命令,如果你還需要幫助,可以看好壓網站的命令行命令介紹:http://haozip.2345.cc/help/help11-1.htm

確保輸入數據集含有.zip格式的Sentinel-2 L1C數據集文件,如圖:
在這裏插入圖片描述
修改後bat腳本命令後,可以在當前數據集路徑下啓動Windows PowerShell執行Sen2Cor_strong.bat腳本或者使用命令行(cmd)執行bat腳本,執行效果圖:
在這裏插入圖片描述
處理後,解壓生成的L1C級數據也會存在,大概處理一個數據集需要15-30分鐘。

Python腳本批處理

終於到了Python版了,如果不喜歡在命令行下敲命令,又不願意使用好壓(HaoZip)。那個可以考慮一下Python,Python也可以調用命令行工具做處理,並且自動打開,自動關閉。

這個Python腳本程序處理的數據集仍然是:下載下來默認格式爲的.zip格式的Sentinel-2 L1C數據集。不需要好壓軟件的支持,直接用Python的標準庫zipfile來解壓。

該程序的邏輯和高配版bat腳本是相同的,就是找到.zip數據集下的某個.zip文件,然後調用好壓提供的命令行工具(HaoZipC.exe)解壓生成.SAFE格式的數據,然後調用L2A_Process.bat對其做大氣校正。

Python代碼(不知道縮複製過來進有沒有問題,最好自己檢查一下)如下:

# 使用Python標準庫調用Sen2cor命令行命令批量對Sentinel-2 L1C數據進行大氣校正
import subprocess
import zipfile
import os

#定義一個解壓函數
def unzip_file(zip_file_name, mode='rb'):
    """
    Return a unzipped file name which comes from the zipped file of A Sentinel-2 L1C data
    返回Sentinel-2 L1C級.zip文件解壓後的文件名
    zip_file_name   - the zipped file name of A Sentinel-2 L1C data  
    mode            - Optional parameter, the mode of the zipped file reader 
    """
    #打開.zip文件
    zip_file = open(zip_file_name, mode)
    #利用zipfile包解壓文件
    zip_fn = zipfile.ZipFile(zip_file)
    #獲取.zip文件的所有子目錄名和文件名
    namelist = zip_fn.namelist()
    for item in namelist:
        #提取.zip文件的子目錄及文件,解壓在當前文件夾('.'表示當前文件夾)
        zip_fn.extract(item, '.')
    #關閉.zip文件
    zip_fn.close()
    zip_file.close()    
    #打印解壓完成
    print("Unzipping finished!")
    #返回解壓後的文件名(字符串,帶.SAFE後綴)
    return namelist[0]
       
#Sen2cor.bat文件所在路徑
sen2cor_path = r"C:\Users\XXXXXX\.snap\auxdata\Sen2Cor-02.08.00-win64\L2A_Process.bat"
#Sentinel-2 L1C原始數據(.zip格式文件,無需解壓)所在目錄
origin_dir = r"G:\test"
#文件模式
pattern = ".zip"
#輸出目錄
output_dir = r"G:\test"

for in_file in os.listdir(origin_dir):
    # 判斷是否是.zip文件
    if pattern in in_file:
        #獲取.zip文件的完整路徑
        zip_file_path = os.path.join(origin_dir, in_file)
        #解壓.zip文件,產生.safe格式文件
        safe_in_file_path = unzip_file(zip_file_path)
        #設置Sen2cor命令行參數,按照原始分辨率處理
        cmd_args = [sen2cor_path, safe_in_file_path, \
                    '--output_dir', output_dir]
        
        #打印處理開始的消息
        print("{} processing begin!".format(safe_in_file_path))
        #傳入命令行參數並調用命令行(cmd)執行命令
        subprocess.call(cmd_args)
        #打印處理完成的消息
        print("{} processing finished!\n".format(safe_in_file_path))

#打印所有文件處理完成的消息
print("All zipped file finished!") 

我不會解釋上面的代碼,但我強調一下使用時需要修改的部分,仍然是路徑。

  • sen2cor_path = r"C:\Users\XXXXXX.snap\auxdata\Sen2Cor-02.08.00-win64\L2A_Process.bat", “”引號內的路徑修改爲你自己的Sen2Cor安裝路徑(注意最後面沒有斜杆“\”),前面r保留(取消轉義字符下同)
  • origin_dir = r"G:\test", “”引號內的路徑修改你的數據集所在路徑(注意最後面沒有斜杆“\”,這次的數據集仍爲.zip格式),前面r保留
  • output_dir = r"G:\test"“”引號內的路徑修改爲你要保存校正後的數據集所在目錄路徑(注意最後面沒有斜杆“\”),前面r保留

複製上述Python代碼,修改對應的路徑,命名然後執行上述Python代碼,Python會打開一個命令窗口(請不要手動關閉,處理完會自動關閉)執行效果圖如下:
在這裏插入圖片描述
處理後,解壓生成的L1C級數據也會存在,大概是15-30分鐘一個數據集。如果你的數據數量很大,還是要等一段時間的(可以看下電影、電視劇等消磨時間)。

校正前後對比結果

以先前用SNAP中的Sen2cor插件處理好的兩個影像爲例,先打開Output Product真彩色影像(L2A產品)。鼠標左鍵單擊選擇Output Product,再右鍵單擊,選擇Open RGB Image Window:
在這裏插入圖片描述默認就是真彩色合成圖,保持默認就行,如果你想看彩紅外(假彩色合成圖)影像可以下拉選擇,False-color Infrared那個選項。點擊OK就行。
在這裏插入圖片描述
等待片刻,即可看到真彩色圖像,同理可以看到打開L1C級數據如圖(注意觀察紅圈裏的數字,這裏指示的是哪個數據集):
在這裏插入圖片描述
可以分隔兩個窗口,以同時顯示兩個數據集,選擇Window ----> Tile Horizontally(水平分隔),注意左下角大紅色圈部分選擇導航示意圖。勾選一下再往下大的兩個紅色圈(一個是逐像素關聯,一個是鼠標指示器關聯,即是鼠標箭頭),往上一個方框裏的A是縮放到全圖(All)之意,P是縮放到像素(Pixel)分辨率之意。或者你點下下方的問號"?"可以看到幫助。
在這裏插入圖片描述
點一下紅色框的A,縮放至全圖:
在這裏插入圖片描述
初看,感覺差別不明顯。實則非也!需要看單個像元的比較。下面查看波譜圖來進行對比。
利用導航工具(紅色圈部分)縮放到某處:

在這裏插入圖片描述
利用工具欄紅色圈的大頭針(Pin)添加標記點Pin 1(大紅圈),如圖:

在這裏插入圖片描述
我們需要將左圖的大頭針複製至右圖,先調出大頭針管理器(選擇View---->Tool Windows---->Pin Manager):
在這裏插入圖片描述可以看到下方出現了,Pin Manage窗口,選擇右下方的紅色圈,將其大頭針複製到右圖:
在這裏插入圖片描述
勾選要複製的到的數據源,點擊OK。
在這裏插入圖片描述
可以看到Pin1成功從左圖複製到右圖。
好的,只差最後一步了——查看波譜圖。
選擇Optial---->Spectrum View:

在這裏插入圖片描述
選擇下圖紅色圈的標記,即可以看到左圖(其圖像邊界有淺黃色背影)的Pin1(水體)波譜圖。
在這裏插入圖片描述
只需將鼠標按右圖點擊一下,即可以看到右圖(其圖像邊界有淺黃色背影)Pin1(水體)的波譜圖:

在這裏插入圖片描述可以看到他們之間的數值,乃至曲線趨勢都存在明顯的區別。因此,無論是對Sentinel-2做任何後續分析處理工作,大氣校正都是必要的。建議你再標準的水體光譜曲線對比一下,這裏,肯定會有差別(受河流泥沙量、葉綠素等因素影響)。事實,Sen2Cor大氣校正的處理效果是很好的。不然,歐空局不會選擇它,而且它要對全球用戶負責,顯然,要經得起檢驗。

你可以看一下前面提到的知乎專欄《環境遙感學習之路》中關於植被光譜的檢驗:Melody sugar知乎專欄《環境遙感學習之路》----【Sentinel-2】(2):哨兵2號數據預處理

後語

可能大氣校正的批處理編寫的方式,不至一種,博主也只是提供了一些參考的依據。說實話,要對遙感影像做精確的大氣校正難度很大,寫一個大氣校正底層程序更是困難,博主對自主開發底層遙感數據處理程序的人員是非常尊敬的!最後,還是提一句,如果你對SNAP或者snappy感興趣的話可以加入博主創建的歐空局SNAP處理交流QQ羣:665903216

參考文獻

[1] Sentinel-2 用戶手冊:https://sentinel.esa.int/documents/247904/685211/Sentinel-2_User_Handbook
[2] 松果兒 知乎專欄《Sentinel影像》----Sen2Cor (V2.8)——哨兵二號的預處理
[3] Melody sugar知乎專欄《環境遙感學習之路》----【Sentinel-2】(2):哨兵2號數據預處理
[4] shub0829 CSDN博客----哨兵2號(sentinel-2)介紹、下載和預處理、批處理
[5] Sen2Cor V2.8.0的用戶手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章