GEE随记(三):提取影像的纹理特征

1. 选取感兴趣区域

下面的代码是随机画取一个矩形geometry,并且空心显示

var roi = ee.FeatureCollection(geometry);
Map.centerObject(roi,7);
var styling ={color:'red',fillColor:'00000000',width:2};// display hollow roi
Map.addLayer(roi.style(styling), {}, "outline");

8d35147bbddc4bc5b21a856397fcf28d.png

2. 获取矢量范围内的遥感影像,以Landsat 8为例

下面的代码是获取一定时间空间范围内的Landsat 8 影像集ImageCollection,去云后中值合成为一张Image,并将波段名字从 “ SR_B* ” 改为 “ B* ”

//设置去云影像函数(SR)
//包括云周边、卷云、云、云阴影和雪
function masksr(image){
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2)
  var thermalBand = image.select('ST_B.*').multiply(0.00341802).add(149.0)
  var qa = image.select('QA_PIXEL')
  var CloudBit = 1<<3
  var CloudShadowBit = 1<<4;
  var DilatedCloudBit = 1<<1;
  var CirrusBit =1<<2;
  // 明确条件,设置两个值都为0
  var mask = qa.bitwiseAnd(CloudBit).eq(0)
               .and(qa.bitwiseAnd(CloudShadowBit).eq(0))
               .and(qa.bitwiseAnd(DilatedCloudBit).eq(0))
               .and(qa.bitwiseAnd(CirrusBit).eq(0));
  return image.addBands(opticalBands,null,true)
              .addBands(thermalBand,null,true)
              .updateMask(mask)}
//加载SR影像whole year
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
           .filterBounds(roi)
           .filterDate('2019-01-01','2020-01-01')
           .map(masksr)
var l8_1 = l8.median().clip(roi).select('SR_B[1-7]').rename(['B1','B2','B3','B4','B5','B6','B7'])
Map.addLayer(l8_1.select(['B4','B3','B2']),{max:0.5,gamma:0.8},'rgb')

aacb0a991bc645e380ece46dffd81245.png

 3. 计算灰度波段并计算纹理特征

(1)参考文献:Object-Oriented LULC Classification in Google Earth Engine Combining SNIC, GLCM, and Machine Learning Algorithms;在利用GEE云平台调用.glcmTexture()进行纹理特征计算前需要先计算灰度图层:

ff32adecbc7a4aba870ced6facc8fc36.png

(2)计算完灰度图层后可以直接调用.glcmTexture()函数:

// compute glcm texture feature
var gray = l8_1.expression(
      '(0.3 * NIR) + (0.59 * R) + (0.11 * G)', {
      'NIR': l8_1.select('B5'),
      'R': l8_1.select('B4'),
      'G': l8_1.select('B3'),
}).rename('gray');

var glcm = gray.unitScale(0,0.30).multiply(100).toInt().glcmTexture({size: 1,kernel:null});
print('glcm',glcm)

8c47087ab417430e922182b461da1be6.png

 

 (3)得到的是包含18个波段的影像,根据个人需求或参考常用灰度共生矩阵纹理特征选择这个Image中的波段,再进行归一化处理(不过这一步感觉不做也行,具体可以看分类后精度有无提升):

// Normalized
var band_glcm = glcm.select(['gray_asm','gray_contrast','gray_corr','gray_var','gray_idm',
                             'gray_savg','gray_svar','gray_sent','gray_ent']);
// calculate the min and max value of an image
var minMax = band_glcm.reduceRegion({
  reducer: ee.Reducer.minMax(),
  geometry: roi,
  scale: 30,
  maxPixels: 1e16,
});

var glcm = ee.ImageCollection.fromImages(
  band_glcm.bandNames().map(function(name){
    name = ee.String(name);
    var band = band_glcm.select(name);
    return band.unitScale(ee.Number(minMax.get(name.cat('_min'))), ee.Number(minMax.get(name.cat('_max'))))
})).toBands().rename(band_glcm.bandNames());

Map.addLayer(glcm.select('gray_asm'),{max:1})

c4a6c0deac6841b6bd243d8e047ee219.png

 

4. 将纹理特征加入波段

一般地物分类而言需要多个波段特征,这时在要分类的Image后直接加.addBands(glcm),就等于把影像的纹理特征也合并到Image当中了,如:

//add texture feature into image
var data = l8_1.addBands(glcm)
print('data',data)

1b3ba0e4acce49f5b8a05dea3853fa55.png

 

 

  • 18
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 36
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值