文章目录

  • 前言
  • 步骤
  • 1.ENVI:打开Image Registration Workflow
  • 2.Image Registration Workflow
  • (1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next
  • (2)修改该参数为100
  • (3)人为选择5个左右控制点,然后Next
  • (4)删除离谱点
  • (5)在ENVI输出配准好的Sentinel影像为.tiff
  • 最后



前言

由于GF-2影像的地理偏移,我们需要在地理上配准下载的Sentinel-2(4季节)和GF-2。



python 遥感影像配准 融合 遥感影像的配准_计算机视觉


步骤

需要准备:1.ENVI;2.区域A的GF-2影像;3.区域A对应的四季节的哨兵影像。
哨兵影像要根据GF-2的矢量框,在Gee下载,矢量框的获取较为简单:
①定义地理坐标系为WGS1984;②重分类;③栅格转面
Gee下载四季影像

1.ENVI:打开Image Registration Workflow



python 遥感影像配准 融合 遥感影像的配准_Mask_02


2.Image Registration Workflow

(1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next



python 遥感影像配准 融合 遥感影像的配准_计算机视觉_03


(2)修改该参数为100



python 遥感影像配准 融合 遥感影像的配准_pytorch_04


(3)人为选择5个左右控制点,然后Next

点“Start Editing"后便可以开始选择控制点



python 遥感影像配准 融合 遥感影像的配准_Image_05


在GF-2上,瞅准某个位置,然后鼠标左键按下(出现十字),然后鼠标右键点击,弹出下图窗口,点击”Accept as Individual Points",然后会自动跳转到Sentinel-2影像,找到对应位置的点,同操作,便完成了控制点1的人工选择。



python 遥感影像配准 融合 遥感影像的配准_Mask_06


你也可以随时"Stop Editing",然后通过来回点击"Switch to Wrap"来查看两幅影像,去寻找你认为合适的控制点(我通常会选择十字路口房屋桥的交界处)。唯一需要注意的是,你决定要去选控制点时(“Start Editing”),第一个Accept是要在GF-2影像上点击的(有时候"Switch to Wrap"后,你没有切回Base Image,即使显示的是Wrap Image,你Accept的这个点,实际是在Base Image上的,这会导致你选择的控制点完全匹配不上)。

(4)删除离谱点

这时它自动选好了控制点,点击"Show Table"。



python 遥感影像配准 融合 遥感影像的配准_Mask_07

删除ERROR高的点,推荐一个个删,然后让RMS Error<1(同时控制点要在10个以上)

python 遥感影像配准 融合 遥感影像的配准_python 遥感影像配准 融合_08

最后,修改此参数为Wrap Image,否则会导致Sentinel-2的分辨率重采样为1米。

python 遥感影像配准 融合 遥感影像的配准_Image_09

点击Next,影像导出为tiff,ASCII文件有时能在人工选择控制点时提供帮助,提高效率,但有时没有用。

python 遥感影像配准 融合 遥感影像的配准_python 遥感影像配准 融合_10

在这里能导入ASCII文件,有时候能让你不需要再人工选择控制点了(因为四张哨兵的地理信息是匹配的)

python 遥感影像配准 融合 遥感影像的配准_计算机视觉_11


(5)在ENVI输出配准好的Sentinel影像为.tiff



python 遥感影像配准 融合 遥感影像的配准_计算机视觉_12


Sentinel{}/Warpsenti{}_C.tiff

例如:目标区域1:
Sentinel1/Warpsenti1_C.tiff
Sentinel1/Warpsenti1_X.tiff
Sentinel1/Warpsenti1_Q.tiff
Sentinel1/Warpsenti1_D.tiff



python 遥感影像配准 融合 遥感影像的配准_python 遥感影像配准 融合_13


最后

如果以GF-2为Base Image,那么每个区域要做4次配准,n个区域就是4n次配准;
如果以Sentinel-2为Base Image,那么每个区域只需要做1次配准,但最终的耕地结果可能和比赛方的“参考答案”存在地理偏差,不知道会不会因此影响比赛分数
如果不影响,那么就能大大节省时间!


Gee代码:

//—————————————————————————————需要修改的参数1:ro 矢量框路径————————————————————————
var ro = ee.FeatureCollection("users/Liuyifei/MAP_data/Studyarea/huantai");
ro = ro.first().geometry()
function maskS2clouds(image) {
  var qa = image.select('QA60');

  // Bits 10 and 11 are clouds and cirrus, respectively.
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;

  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  return image.updateMask(mask).divide(10000);
}
var Mlt = function(image) {
  return image.multiply(10000);
};
//——————————————————————需要修改的参数2:folderr 第几个目标区域,只改数字————————————————————————
var folderr='Mapsenti'+'1';
//——————————————————————其它不需要动了————————————————————————
var start1='2020-12-01';
var end1='2021-03-01';
var dirname1=folderr+'_D';

var start2='2020-03-01';
var end2='2020-06-01';
var dirname2=folderr+'_C';

var start3='2021-06-01';
var end3='2021-09-01';
var dirname3=folderr+'_X';

var start4='2020-09-01';
var end4='2020-12-01';
var dirname4=folderr+'_Q';
// Map the function over one year of data.

// Load Sentinel-2 TOA reflectance data.

//export data1
var exportdataset1 =  ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterBounds(ro)
                  .filterDate(start1,end1)
                  // Pre-filter to get less cloudy granules.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                  // .sort('CLOUDY_PIXEL_PERCENTAGE',false)
                  .map(maskS2clouds)
                  .select(['B2','B3', 'B4', 'B8']);

var exp1=exportdataset1.map(Mlt)
var mosaic1 = exp1.median().clip(ro);

Map.addLayer(mosaic1, {bands: ['B4', 'B3', 'B2'],min:0.0,max:0.3,gamma:0.5}, 'Crop Landcover');
  Export.image.toDrive({
      image:mosaic1,
      description:dirname1,
      scale:10,
      folder :folderr,
      // crs: "EPSG:32649",
      maxPixels: 1e13,
      region:ro,
      fileFormat: 'GeoTIFF',
      formatOptions: {
        cloudOptimized: true
      }
    });
var num=exportdataset1.size()
print('Winter',num)
//export data2
var exportdataset2 =  ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterBounds(ro)
                  .filterDate(start2,end2)
                  // Pre-filter to get less cloudy granules.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                  .map(maskS2clouds)
                  .select(['B2','B3', 'B4', 'B8']);

var exp2=exportdataset2.map(Mlt);
var mosaic2 = exp2.median().clip(ro);
  
  Export.image.toDrive({
      image:mosaic2,
      description:dirname2,
      scale:10,
      folder :folderr,
      // crs: "EPSG:32649",
      maxPixels: 1e13,
      region:ro,
      fileFormat: 'GeoTIFF',
      formatOptions: {
        cloudOptimized: true
      }
    });
var num=exportdataset2.size()
print('Spring',num)
//export data3
var exportdataset3 =  ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterBounds(ro)
                  .filterDate(start3,end3)
                  // Pre-filter to get less cloudy granules.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                  .map(maskS2clouds)
                  .select(['B2','B3', 'B4', 'B8']);

var exp3=exportdataset3.map(Mlt);
var mosaic3 = exp3.median().clip(ro);
  
  Export.image.toDrive({
      image:mosaic3,
      description:dirname3,
      scale:10,
      folder :folderr,
      // crs: "EPSG:32649",
      maxPixels: 1e13,
      region:ro,
      fileFormat: 'GeoTIFF',
      formatOptions: {
        cloudOptimized: true
      }
    });
var num=exportdataset3.size()
print('Summer',num)
//export data4
var exportdataset4 =  ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterBounds(ro)
                  .filterDate(start4,end4)
                  // Pre-filter to get less cloudy granules.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                  .map(maskS2clouds)
                  .select(['B2','B3', 'B4', 'B8']);

var exp4=exportdataset4.map(Mlt);
var mosaic4 = exp4.median().clip(ro);
  
  Export.image.toDrive({
      image:mosaic4,
      description:dirname4,
      scale:10,
      folder :folderr,
      // crs: "EPSG:32649",
      maxPixels: 1e13,
      region:ro,
      fileFormat: 'GeoTIFF',
      formatOptions: {
        cloudOptimized: true
      }
    });
var num=exportdataset4.size()
print('Autumn',num)'''