基于MODIS数据的地表温度反演具体实现

一、地表温度反演原理

        简单来说,反演原理就是根据热红外的两个波段,31、32波段根据普朗克公式进行地表亮温的反演,1、2波段进行NDVI—>植被覆盖度—>热辐射相互作用—>地表比辐射率的反演,然后2、19波段进行水汽含量—>大气透过率的反演,根据地表比辐射率和大气透过率对地表亮温进行修正,得到地表温度。

        在反演之前,最好进行一个云掩膜。将有云的区域可以进行去掉,这样才能保证地表温度反演的正确性。也可以将有水的区域进行掩膜,而具体的掩膜算法也往往是根据不同波段的反射率不同来确定的。

二、地表温度反演具体公式

        地表温度反演在前人的研究中有多种反演方法,单窗、劈窗等多种算法。现在比较流行的地表温度反演算法是覃志豪的劈窗算法。其中具体的公式如下:

1、温度反演公式  

基于MODIS数据的地表温度反演具体实现_第1张图片

2、亮度温度反演公式

基于MODIS数据的地表温度反演具体实现_第2张图片

3、地表比辐射率反演公式

基于MODIS数据的地表温度反演具体实现_第3张图片

4、大气透过率反演公式

基于MODIS数据的地表温度反演具体实现_第4张图片

         以上反演公式主要是参考论文整理得出,参考论文主要包括覃志豪的论文,以及一些相关的硕士论文:《用MODIS数据反演地表温度的基本参数估计方法》《喜马拉雅地震带温度场时空特征研究》等……。不同来源的数据的反演具体参数可能不同,但是具体的反演思路和方法是可以借鉴的。

三、地表温度反演具体实现

1、MODIS数据下载与预处理

        在官网(Find Data - LAADS DAAC)选择MOD021KM和MOD03地理坐标数据进行下载。其中,MOD03地理坐标数据是为了对MOD021KM数据进行几何校正。具体的镶嵌、裁剪、几何校正和重投影可以在ENVI中实现。当大量数据需要批量处理时,可以在ModisTool和ModisSwathTool中实现(这两个工具都需要java环境才可以成功安装),也可以利用各种算法、IDL实现。但这两个工具可以将需要的波段进行处理后按照tif格式单个输出。就方便后续用编程实现地表温度的计算。

2、地表温度反演在ENVI中实现

        在反演之前,利用ENVI5.3或者ENVI Classic 5.3查看HDF数据的属性,确定各个波段的辐射定标参数,然后进行各个波段的辐射定标,Basic Tools——Preprocessing——Data-Specific Utilities——View HDF Dataset Attributes,确定缩放尺度和偏移值。

        辐射定标公式:Radiance = Radiance_scales * ( DN - Radiance_offsets)。

   其中,Radiance_scales:辐亮度缩放尺度,Radiance_offsets:辐亮度偏移值;Reflectance_scales:反射率缩放尺度,Reflectance_offsets:反射率偏移值。

        利用BandMath工具,根据地表温度的反演原理进行一步一步的计算。

3、地表温度反演在算法中实现

        根据MODIS预处理数据得到1、2、19、31、32共5个波段的数据(最好是tif格式),方便python和matlab读取,如果数据量过大,可以先根据需要的区域进行相应的裁剪,再进行温度反演。下面以matlab中实现为例:

①代码实现5个波段的辐射定标

                 if(TF1 == 1)
                        display('波段1 反射率 Processing!')
                        image1=0.5224.*image;  
                        image_1=double(image1)./double(10000);
                        
                 else if ( TF2 == 1)
                         display('波段2 反射率 Processing!')                         
                         image1= 0.3152.*image;                        
                         image_1=double(image1)./double(10000);

②代码实现31、32波段的亮温反演

                 if(TF31 == 1)   
                         bandnew ='31TT';
                         display('波段31 亮度温度 Processing!')    
                         image_2=1304.41./log(double(729.54)./double(image)+1);    
                         
                 else
                         bandnew ='32TT';
                         display('波段32 亮度温度 Processing!')
                         image_2= 1196.98./log(double(474.68)./double(image)+1);
                         
                 end  

③代码实现地表比辐射率反演

        %根据反射率波段1和波段2计算NDVI
        image_2=(double(image_1)-double(image))./(double(image_1)+double(image));
        %判断NDVI是否小于0,当NDVI小于0,直接赋值为水体的地表比辐射率
        if double(image) < 0
            image_31=0.99683;
            image_32=0.99254;
        %当NDVI大于0
        else
            FVC = (double(image) - 0.7)./(0.15 - 0.7);%计算植被覆盖度
            RVeg = 0.92762+0.07033.*double(FVC);%计算植被比辐射率
            RSoil =0.99782+0.08362.*double(FVC);%计算裸土比辐射率
            ds = 0.3796.*double(min(FVC,1-FVC));
            dS = double(ds)./double(100);%计算热辐射校正作用
            %计算31、32波段的地表比辐射率
            image_31=FVC .* RVeg.* 0.98672  + (1-FVC).* RSoil .* 0.96767 + dS;
            image_32=FVC .* RVeg.* 0.98990  + (1-FVC).* RSoil .* 0.97790 + dS;
        end

④代码实现大气透过率反演

         %根据反射率波段19和波段2计算大气水汽含量w
         w1=((0.02 - log(double(image)./double(image_1)))./0.651).^2;
         w=double(w1);
         if (0.2<= w)&(w <=1.0)
             image_31 = 0.97366 - 0.05468.*w;
             image_32 = 0.96210 - 0.08991.*w;
         else if(1.0< w)&(w <=2.0)
                 image_31 = 0.99978 - 0.07804.*w;
                 image_32 = 0.99043 - 0.11528.*w;

⑤代码实现温度反演

        %根据大气透射率和地表比辐射率计算参数C31、C32、D31、D32
        C31 = double(image_S31).*double(image_t31);
        D31 = (1-double(image_t31)).*(1+(1-double(image_S31)).*double(image_t31));

        C32 = double(image_S32).*double(image_t32);
        D32 = (1-double(image_t32)).*(1+(1-double(image_S32)).*double(image_t32));

        %根据参数C31、C32、D31、D32等计算参数A0、A1、A2
        A0 =  a31.*D32.*(1-C31-D31)./(D32.*C31-D31.*C32)-a32.*D31.*(1-C32-D32)./(D32.*C31-D31.*C32);
        A1 = 1+D31./(D32.*C31-D31.*C32)+b31.*D32.*(1-C31-D31)./(D32.*C31-D31.*C32);
        A2 = D31./(D32.*C31-D31.*C32)+b32.*D31.*(1-C32-D32)./(D32.*C31 - D31.*C32);

        %根据参数A0、A1、A2计算地表温度T
        image_T =A0 + A1.*double(image_T31) - A2.*double(image_T32);

(学习中的小菜鸟,感谢指出不足,但是请轻喷,谢谢♥)

你可能感兴趣的:(遥感,算法,matlab)