遥感生态指数(RSEI):理论发展、方法论争与实践进展

遥感生态指数(RSEI):理论发展、方法论争与实践进展

所以给大家更新文章吧,这事好久不做了,好多年不做了。啊~谢谢谢谢,献丑了献丑了。

摘要

遥感生态指数(RSEI)是一种基于多光谱遥感数据,通过主成分分析(PCA)耦合绿度、湿度、热度和干度四个指标,以实现区域生态环境快速、客观、可视化评价的综合指数。本文系统回顾了RSEI从2013年提出至今的理论发展与实践演进历程,重点阐述了其在解决特征向量方向不确定性、数据标准化处理等关键问题上的改进与优化。同时,文章探讨了当前围绕RSEI模型的核心争议(如指标方向固定方法的局限性),并通过福州、拉萨的案例展示了其具体实现流程与应用效果。旨在为相关领域的研究者提供一个关于RSEI指数发展、现状与前沿争鸣的清晰框架。

一、RSEI的诞生

2013年,徐涵秋教授首次提出遥感生态指数(RSEI)[1],旨在解决传统生态评价方法中数据获取难、主观性强、结果不可视等问题。

RSEI选取了四个与人类生存息息相关的生态要素:

  • 绿度,用植被指数(NDVI)表示
  • 湿度,用缨帽变换的湿度分量(Wet)表示
  • 热度,用地表温度(LST)表示
  • 干度,用建筑裸土指数(NDBSI)表示

与传统多指标加权求和的方法不同,RSEI采用主成分分析(PCA) 将四个指标压缩成一个综合指数,权重由数据本身决定,避免了人为定权的主观性。

二、RSEI的完善

随着RSEI的广泛应用,其本身的一些问题也逐渐暴露,学者们提出了多种改进方案:

1. 解决特征向量方向不确定性问题

早期RSEI在计算第一主成分(PC1)时,特征向量方向随机,导致结果可能出现完全相反的情况。Li等人通过固定特征向量方向,提出改进模型,确保结果一致性和可比性[3]。

2. 标准化替代归一化

郑子豪等人发现,传统归一化方法在时间序列分析中易受极值干扰 ,提出使用标准化处理 并结合离散化方案(DRSEI),显著提高了时间序列分析的稳定性[2]。

3. MRSEI

有学者提出加入第二、三主成分以"增加信息量",但徐涵秋指出这反而会混淆生态信息[4]

4. 核主成分分析(kPCA)

有学者建议用kPCA处理非线性关系,但徐涵秋研究表明四个指标间实为线性强相关,kPCA反而引入过度拟合[5]

三、 RSEI的争议

Li等基于四个指标对生态环境的实际影响来固定特征向量方向,对生态环境有正面影响的归一化植被指数(NDVI)和湿度指数(Wet)的特征向量取绝对值,对生态环境有负面影响的地表温度(LST)和归一化雪盖指数(NDSI)的特征向量取绝对值的相反数,以此对模型进行改进。但是在实际应用中,存在一些问题

当四个指标的方向如下:

NDVI Wet LST NDBSI

此时为理想情况,不做任何处理,RSEI计算公式为RSEI0=PC1RSEI0 = PC1RSEI0=PC1

当四个指标的方向如下:

NDVI Wet LST NDBSI

当出现这种方向相反的情况时,可以令RSEI0=1−PC1RSEI0 = 1 - PC1RSEI0=1−PC1,其结果在经过归一化后是与理想情况等价的。

或者根据Li的方法,手动将四个指标的方向改为正正负负,此时该方向只是原始特征向量方向量的反转,仍是方差最大的方向,如图:

将修正后的特征向量方向参与主成分分析,不影响后续计算,RSEI计算公式仍为RSEI0=PC1RSEI0 = PC1RSEI0=PC1。

当四个指标的方向如下:

NDVI Wet LST NDBSI
... ... ... ...

当出现正正负负和负负正正之外的情况时,如果仍手动将四个指标的方向改为正正负负,则修正后的特征向量方向为原始特征向量方向量的对称轴,不是方差最大的方向,如图:

出现这种异常

是否意味着Li的方法具有局限性

或者RSEI使用区域有限。

或者输入数据可能存在特殊问题。

排查建议:

**数据源与时相:**影像是否来自植被生长季? cloud mask是否干净?

**研究区特殊性:**研究区域是否有大范围水体、冰雪、盐碱地或特殊的城市结构,导致 Wet 分量与其他指标的关系背离常理?(例如,在干旱区,水体很少,Wet 分量可能主要响应的是土壤或建筑材质,而非植被)。

**计算过程:**确认四个指标都使用了相同范围的有效像元,并且都进行了正确的标准化(归一化或标准化)。

四、RSEI的实现

以下是基于Google Earth Engine的RSEI实现代码:

javascript 复制代码
// 定义全局变量
var scale = 1000; // 分析尺度
var year = 2020; // 分析年份
var table = ee.FeatureCollection("users/lijian960708/china-shp/china-city"); // 中国城市行政区划数据

// 选择研究区域 - 福州市
var roi = table.filter(ee.Filter.eq("地名", "福州市"));
Map.centerObject(roi, 9); // 地图中心定位到研究区域,缩放级别9

/**
 * 云掩膜函数
 * 使用QA_PIXEL波段去除云和云阴影
 */
var maskclouds = function(img) {
  var cloudShadowBitMask = 1 << 4; // 云阴影位掩码
  var cloudsBitMask = 1 << 3; // 云位掩码
  var qa = img.select("QA_PIXEL"); // 选择质量评估波段
  // 创建掩膜:无云阴影且无云
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0).and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return img.addBands(img.updateMask(mask), null, true); // 应用掩膜
};

/**
 * 应用比例因子函数
 * 将DN值转换为地表反射率和地表温度
 */
var applyScaleFactors = function(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2); // 光学波段比例因子
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0).subtract(273.15); // 热红外波段比例因子,转换为摄氏度
  return image.addBands(opticalBands, null, true).addBands(thermalBands, null, true); // 添加处理后的波段
};

/**
 * 计算NDVI(归一化植被指数)
 * 公式:(NIR - Red) / (NIR + Red)
 */
var NDVI = function(image) {
    return image.addBands(
        image.normalizedDifference(["NIR", "Red"])
        .rename("NDVI")); // 添加NDVI波段
};

/**
 * 计算WET(湿度分量)
 * 基于缨帽变换的湿度分量
 */
var WET = function(image) {
  var WET = image.expression(
    'Blue * 0.1511 + Green * 0.1973 + Red * 0.3283 + NIR * 0.3407 + SWIR1 * (-0.7117) + SWIR2 * (-0.4559)',
    {
      'Blue': image.select('Blue'),
      'Green': image.select('Green'),
      'Red': image.select('Red'),
      'NIR': image.select('NIR'),
      'SWIR1': image.select('SWIR1'),
      'SWIR2': image.select('SWIR2')
    }
  ).rename('WET');
  return image.addBands(WET); // 添加WET波段
};

/**
 * 计算NDBSI(归一化建筑指数)
 * 结合SI(裸土指数)和IBI(建筑指数)
 */
var NDBSI = function(image) {
   // 计算SI(裸土指数)
  var SI = image.expression(
    '((SWIR1 + Red) - (NIR + Blue)) / ((SWIR1 + Red) + (NIR + Blue))',
    {
      'SWIR1': image.select('SWIR1'),
      'Red': image.select('Red'),
      'NIR': image.select('NIR'),
      'Blue': image.select('Blue')
    }
  );
  
  // 计算IBI(建筑指数)
  var IBI = image.expression(
    '(2 * SWIR1 / (SWIR1 + NIR) - (NIR / (NIR + Red) + Green / (Green + SWIR1))) / ' +
    '(2 * SWIR1 / (SWIR1 + NIR) + (NIR / (NIR + Red) + Green / (Green + SWIR1)))',
    {
      'SWIR1': image.select('SWIR1'),
      'NIR': image.select('NIR'),
      'Red': image.select('Red'),
      'Green': image.select('Green')
    }
  );
  
  // 计算NDBSI:SI和IBI的平均值
  var NDBSI = SI.add(IBI).divide(2).rename('NDBSI');
  return image.addBands(NDBSI); // 添加NDBSI波段
};

/**
 * 图像归一化函数
 * 将各波段值归一化到0-1范围
 */
var img_norm = function(image) {
  var minMax = image.reduceRegion({
    reducer: ee.Reducer.minMax(), // 最小最大值归约器
    geometry: roi, // 研究区域
    scale: scale, // 空间尺度
    maxPixels: 10e13, // 最大像素数
  });
  
  // 对每个波段进行归一化
  var image_norm = ee.ImageCollection.fromImages(image.bandNames().map(function(name) {
    name = ee.String(name);
    var band = image.select(name);
    var min = ee.Number(minMax.get(name.cat('_min'))); // 获取最小值
    var max = ee.Number(minMax.get(name.cat('_max'))); // 获取最大值
    var norm = band.subtract(min).divide(max.subtract(min)); // 归一化计算
    return norm;
  })).toBands();
  
  image_norm = image_norm.rename(image.bandNames()); // 重命名波段
  return image_norm;
};

/**
 * 主成分分析函数
 * 计算四个指标(NDVI, WET, LST, NDBSI)的主成分
 */
var getPAC = function(image){
  var bandNames = image.bandNames();
  
  // 数据中心化
  var meanDict = image.reduceRegion({
      reducer: ee.Reducer.mean(), // 平均值归约器
      geometry: roi,
      scale: scale,
      maxPixels: 1e13
  });
  var means = ee.Image.constant(meanDict.values(bandNames));
  var centered = image.subtract(means); // 减去均值
  
  var arrays = centered.toArray(); // 转换为数组
  
  // 计算协方差矩阵
  var covar = arrays.reduceRegion({
      reducer: ee.Reducer.centeredCovariance(), // 中心化协方差归约器
      geometry: roi,
      scale: scale,
      maxPixels: 1e13
  });
  
  // 特征值分解
  var covarArray = ee.Array(covar.get('array'));
  var eigens = covarArray.eigen();
  print('eigens', eigens);
  
  // 计算各主成分的方差贡献率
  var eigenValues = eigens.slice(1, 0, 1);
  var eigenValuesList = eigenValues.toList().flatten();
  var total = eigenValuesList.reduce(ee.Reducer.sum());
  var percentageVariance = eigenValuesList.map(function(item) {
    return ee.Number(item).divide(total).multiply(100).format("%.2f");
  });
  print('percentageVariance', percentageVariance);   
  
  // 获取特征向量
  var eigenVectors = eigens.slice(1, 1);
  print('原特征向量方向', eigenVectors);
  
  // 获取PC1的系数并调整方向(根据RSEI理论)
  var NDVICoef = eigenVectors.get([0, 0]);
  var WETCoef = eigenVectors.get([0, 1]);
  var LSTCoef = eigenVectors.get([0, 2]);
  var NDBSICoef = eigenVectors.get([0, 3]);
  print('NDVI系数', NDVICoef);
  print('WET系数', WETCoef);
  print('LST系数', LSTCoef);
  print('NDBSI系数', NDBSICoef);
  
  // 调整PC1系数方向:NDVI和WET取正,LST和NDBSI取负
  var PC1Coef = ee.Array([[NDVICoef.abs(),WETCoef.abs(),LSTCoef.abs().multiply(-1),NDBSICoef.abs().multiply(-1)]]);
  eigenVectors = ee.Array.cat([PC1Coef, eigenVectors.slice(0, 1)], 0);
  print('调整后特征向量方向', eigenVectors);
  
  // 计算主成分
  var arrayImage = arrays.toArray(1);
  var principalComponents = ee.Image(eigenVectors).matrixMultiply(arrayImage);
  var PCA = principalComponents.arrayProject([0]).arrayFlatten([['PC1', 'PC2', 'PC3', 'PC4']]);
  return PCA;
};

// 创建水体掩膜(去除永久水体和季节性水体)
var water = ee.ImageCollection('JRC/GSW1_4/YearlyHistory').filterDate(year + '-01-01', year + '-12-31').first();
var mask = water.eq(2).add(water.eq(3)).unmask().eq(0).clip(roi); // 掩膜掉水体(值2和3)

// 定义波段名称映射
var srcBands = ["SR_B2", "SR_B3", "SR_B4", "SR_B5", "SR_B6", "SR_B7", "ST_B10"];
var toBands = ["Blue", "Green", "Red", "NIR", "SWIR1", "SWIR2", "LST"];

// 加载和处理Landsat 8影像
var imageCol = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")
                 .filterBounds(roi) // 空间过滤
                 .filterDate(year + '-01-01', year + '-12-31') // 时间过滤
                 .map(maskclouds) // 云掩膜
                 .map(applyScaleFactors) // 应用比例因子
                 .select(srcBands, toBands) // 选择并重命名波段
                 .map(NDVI) // 计算NDVI
                 .map(WET) // 计算WET
                 .map(NDBSI); // 计算NDBSI

// 合成中值影像并应用水体掩膜
var image = imageCol.select(['NDVI', 'WET', 'LST', 'NDBSI']).median().updateMask(mask).clip(roi);

// 归一化四个生态指标
var image_norm = img_norm(image);

// 主成分分析
var PCA = getPAC(image_norm);

// 提取第一主成分作为初始RSEI
var RSEI_0 = PCA.select("PC1");

// 对RSEI进行归一化得到最终结果
var RSEI = img_norm(RSEI_0);

// 创建RSEI直方图
var Histogram = ui.Chart.image.histogram({
  image: RSEI,
  region: roi,
  scale: scale,
  maxPixels: 1e10
});
print('Histogram of RSEI', Histogram);

// 定义可视化参数
var visParam = {
  min: 0, // 最小值
  max: 1, // 最大值
  palette: ['C2523C', 'F2B60E', '77ED00', '1BAA7D', '0B2C7A'] // 颜色方案:从差到好
};

// 在地图上显示RSEI结果
Map.addLayer(RSEI, visParam, 'RSEI');

福州市的结果:


拉萨市的结果:


四、结语

以上便是个人对RSEI的一些浅见与总结。遥感生态评价领域方兴未艾,其中必然还有许多值得探讨的细节与不同的见解。文中若有任何疏漏或不当之处,欢迎各位大佬批评指正,期待能与大家一同交流讨论!


参考文献

1\] 徐涵秋. 区域生态环境变化的遥感评价指数\[J\]. 中国环境科学, 2013,33(5):889-897. \[2\] Zheng Z, Wu Z, Chen Y, et al. Instability of remote sensing based ecological index (RSEI) and its improvement for time series analysis\[J\]. Science of the Total Environment, 2022, 814: 152595. \[3\] Li N, Wang J, Qin F. The improvement of ecological environment index model RSEI\[J\]. Arabian Journal of Geosciences, 2020, 13: 403. \[4\] 徐涵秋, 邓文慧. MRSEI指数的合理性分析及其与RSEI指数的区别\[J\]. 遥感技术与应用, 2022, 37(1):1-7. \[5\] 徐涵秋, 李春强, 林梦婧. RSEI应使用主成分分析或核主成分分析?\[J\]. 武汉大学学报(信息科学版), 2023,48(4):506-513.

相关推荐
得贤招聘官9 小时前
AI招聘的核心破局:从“流程装饰”到“决策引擎”
人工智能
一水鉴天9 小时前
整体设计 定稿 之26 重构和改造现有程序结构 之2 (codebuddy)
开发语言·人工智能·重构·架构
cici1587410 小时前
二值化断裂裂缝的智能拼接算法
人工智能·算法·计算机视觉
麦格芬23010 小时前
LeetCode 763 划分字母区间
算法·leetcode·职场和发展
裤裤兔10 小时前
医学影像深度学习知识点总结
人工智能·深度学习·机器学习·医学影像·医学图像
free-elcmacom10 小时前
机器学习进阶<8>PCA主成分分析
人工智能·python·机器学习·pca
福尔摩斯张10 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
亚马逊云开发者10 小时前
Q CLI助力合合信息实现Aurora的升级运营
人工智能
前端一小卒10 小时前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
syt_101310 小时前
Object.defineProperty和Proxy实现拦截的区别
开发语言·前端·javascript