google earth engine (GEE)面向对象分类 代码

遥感常用的三大类型分类方法:监督分类,非监督分类,以及面向对象分类。前两个代码,我很熟悉,并且都能做出比较好的效果。目前我对某市的landsat影像使用了面向对象分类,但是结果不是让人满意。

我把代码放出来,希望能帮到需要的人,如果有人想要深入研究,探讨一下为什么面向对象结果差强人意,欢迎留言:

这个是分类代码:https://code.earthengine.google.com/66b894f4991df1a955c554f3ba368e82,可以直接使用。

//选择数据源
var imageCollection = ee.ImageCollection('USDA/NAIP/DOQQ');
//研究区
var geometry = /* color: #0b4a8b */ee.Geometry.Polygon(
        [[[-121.89511299133301, 38.98496606984683],
          [-121.89511299133301, 38.909335196675435],
          [-121.69358253479004, 38.909335196675435],
          [-121.69358253479004, 38.98496606984683]]], null, false);
//样本数据(这个是US的cdl数据,包含了各个地块的农作物类别信息)
var cdl2016 = ee.Image('USDA/NASS/CDL/2016');

var bands = ['R', 'G', 'B', 'N']
//数据筛选与镶嵌
var img = imageCollection
    .filterDate('2015-01-01', '2017-01-01')
    .filterBounds(geometry)
    .mosaic()
img = ee.Image(img).clip(geometry).divide(255).select(bands)
Map.centerObject(geometry, 13)
Map.addLayer(img, {gamma: 0.8}, 'RGBN', false)
//设置种子
var seeds = ee.Algorithms.Image.Segmentation.seedGrid(36);

//利用 SNIC 进行分割,得到对象。参数的设置根据自己的需求来
var snic = ee.Algorithms.Image.Segmentation.SNIC({
  image: img, 
  size: 32,
  compactness: 5,
  connectivity: 8,
  neighborhoodSize:256,
  seeds: seeds
}).select(['R_mean', 'G_mean', 'B_mean', 'N_mean', 'clusters'], ['R', 'G', 'B', 'N', 'clusters'])
//clusters就是分割得到的一个个对象
var clusters = snic.select('clusters')
Map.addLayer(clusters.randomVisualizer(), {}, 'clusters')
Map.addLayer(snic, {bands: ['R', 'G', 'B'], min:0, max:1, gamma: 0.8}, 'means', false)

//计算每个对象的 stdDev.
var stdDev = img.addBands(clusters).reduceConnectedComponents(ee.Reducer.stdDev(), 'clusters', 256)
Map.addLayer(stdDev, {min:0, max:0.1}, 'StdDev', false)


var area = ee.Image.pixelArea().addBands(clusters).reduceConnectedComponents(ee.Reducer.sum(), 'clusters', 256)
Map.addLayer(area, {min:50000, max: 500000}, 'Cluster Area', false)

var minMax = clusters.reduceNeighborhood(ee.Reducer.minMax(), ee.Kernel.square(1));
var perimeterPixels = minMax.select(0).neq(minMax.select(1)).rename('perimeter');
Map.addLayer(perimeterPixels, {min: 0, max: 1}, 'perimeterPixels');

var perimeter = perimeterPixels.addBands(clusters)
    .reduceConnectedComponents(ee.Reducer.sum(), 'clusters', 256);
Map.addLayer(perimeter, {min: 100, max: 400}, 'Perimeter size', false);

var sizes = ee.Image.pixelLonLat().addBands(clusters).reduceConnectedComponents(ee.Reducer.minMax(), 'clusters', 256)
var width = sizes.select('longitude_max').subtract(sizes.select('longitude_min')).rename('width')
var height = sizes.select('latitude_max').subtract(sizes.select('latitude_min')).rename('height')
Map.addLayer(width, {min:0, max:0.02}, 'Cluster width', false)
Map.addLayer(height, {min:0, max:0.02}, 'Cluster height', false)

//分类器参数设置,选择分类依据:包括了area,width等
var objectPropertiesImage = ee.Image.cat([
  snic.select(bands),
  stdDev,
  area,
  perimeter,
  width,
  height
]).float();
//选择训练样本
var training = objectPropertiesImage.addBands(cdl2016.select('cropland'))
    .updateMask(seeds)
    .sample(geometry, 5);
//分类
var classifier = ee.Classifier.randomForest(10).train(training, 'cropland')
Map.addLayer(objectPropertiesImage.classify(classifier), {min:0, max:254}, 'Classified objects')

切割的对象的结果如下图所示,针对自己的数据源,参数要做出适合的调整:

google earth engine (GEE)面向对象分类 代码_第1张图片

基于面向对象的结果如下所示,可以对结果导出,查看具体的类别。

google earth engine (GEE)面向对象分类 代码_第2张图片

需要注意的两个地方:1.分割器的选择以及参数设置;2.分类方法的选择。

 

你可能感兴趣的:(GOOGLE,EARTH,ENGINE,遥感)