基于Python 进行卫星图像多种指数分析
一、前言
本文帮助读者更好地了解卫星数据以及使用 Python 探索和分析哨兵2卫星数号数据在Sundarbans地区的不同方法。
二、Sundarbans研究区
孙德尔本斯(Sundarbans)是恒河、雅鲁藏布江和梅克纳河在孟加拉湾汇合形成的三角洲中最大的红树林区之一。 孙德尔本斯森林横跨印度和孟加拉国,面积约 10,000 平方公里,其中 40% 位于印度境内,是许多珍稀和全球受威胁野生动物物种的家园。 下面的谷歌地图显示了孙德尔本斯地区。

在本文中,我们将使用2020年1月27日使用Sentinel-2卫星获取的Sundarbans卫星数据的一小部分。该Sundarbans数据的优化自然色图像如下所示:

卫星数据有 954 * 298 像素,12 个波段,光谱分辨率从 10 — 60 米不等。
三、数据分析
为了对 Sundarbans 数据执行不同的操作,我们将使用 EarthPy、RasterIO、Matplotlib、Plotly 等库进行数据可视化和分析。
让我们通过导入必要的包开始编码:
from glob import globimport earthpy as et
import earthpy.spatial as es
import earthpy.plot as epimport rasterio as rioimport matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormapimport plotly.graph_objects as gonp.seterr(divide='ignore', invalid='ignore')(1)数据读取
让我们使用 rasterio 读取 12 个波段,并使用 numpy.stack() 方法将它们堆叠到一个 n 维数组中。 堆叠后的结果数据具有形状 (12, 954, 298)。
S_sentinel_bands = glob("/content/drive/MyDrive/Satellite_data/sundarbans_data/*B?*.tiff")S_sentinel_bands.sort()l = []for i in S_sentinel_bands:with rio.open(i, 'r') as f:l.append(f.read(1))arr_st = np.stack(l)(2)波段可视化
正如我们所讨论的,数据包含 12 个波段。 让我们使用 EarhPy 包可视化每个波段。 plot_bands() 方法获取波段和绘图的堆栈以及自定义标题,这可以通过使用 title= 参数将每个图像的唯一标题作为标题列表传递来完成。
ep.plot_bands(arr_st, cmap = 'gist_earth', figsize = (20, 12), cols = 6, cbar = False)
plt.show()
(3)RGB波段合成
研究区有多个波段,包含从可见光到红外线的数据。 因此很难为人类可视化数据。 通过创建 RGB 合成图像,可以更轻松有效地理解数据。 要绘制 RGB 合成图像,您将绘制红色、绿色和蓝色波段,它们分别是波段 4、3 和 2。 由于 Python 使用从零开始的索引系统,因此您需要从每个索引中减去 1 的值。 因此,红色波段的索引为 3,绿色为 2,蓝色为 1。
如果像素亮度值偏向零值,我们创建的合成图像有时会变暗。 此类问题可以通过拉伸图像中的像素亮度值来解决,使用参数 stretch=True 将值扩展到潜在值的完整 0-255 范围,以增加图像的视觉对比度。 此外,str_clip 参数允许您指定要剪掉多少数据尾部。 数字越大,数据被拉伸或变亮的程度就越大。
让我们看看绘制 RGB 合成图像以及应用拉伸的代码。
# RGB Composite Imagergb = ep.plot_rgb(arr_st, rgb=(3,2,1), figsize=(10, 16))
plt.show()# RGB Composite Image with Strechep.plot_rgb(arr_st,rgb=(3, 2, 1),stretch=True,str_clip=0.2,figsize=(10, 16))
plt.show()
上图显示了应用拉伸前后孙德尔本斯数据的 RGB 合成图像。
(4)直方图
可视化高光谱图像数据集的波段有助于我们了解波段像素/值的分布。 earhtpy.plot 中的 hist 方法通过为我们之前创建的数据集/堆栈的波段绘制直方图来完成这项工作。 我们还可以修改各个直方图的列大小、标题和颜色。 让我们看看绘制直方图的代码。
colors = ['tomato', 'navy', 'MediumSpringGreen', 'lightblue', 'orange', 'blue','maroon', 'purple', 'yellow', 'olive', 'brown', 'cyan']ep.hist(arr_st, colors = colors,title=[f'Band-{i}' for i in range(1, 13)], cols=3, alpha=0.5, figsize = (12, 10))plt.show()
(5)植被和土壤指数
归一化卫星指数是根据多光谱卫星图像计算得出的图像。 这些图像强调存在的特定现象,同时减轻降低图像效果的其他因素。 例如,植被指数将在索引图像中将健康的植被显示为明亮,而不健康的植被具有较低的值,贫瘠的地形是黑暗的。 由于地形变化(山丘和山谷)的阴影会影响图像的强度,因此创建指数的方式是强调对象的颜色而不是对象的强度或亮度。
归一化植被指数 (NDVI)
要确定一块土地上的绿色密度,研究人员必须观察植物反射的可见光 (VIS) 和近红外 (NIR) 阳光的不同颜色(波长)。 归一化差异植被指数 (NDVI) 通过测量植被强烈反射的近红外光和红光(植被吸收的)之间的差异来量化植被。 NDVI 的范围总是从 -1 到 +1。
NDVI = ((NIR - Red)/(NIR + Red))例如,当你有负值时,它很可能是水。 另一方面,如果您的 NDVI 值接近 +1,则它很可能是茂密的绿叶。 但当 NDVI 接近于零时,就没有绿叶,甚至可能是城市化区域。
让我们看看在 Sundarbans 卫星数据上实现 NDVI 的代码。
ndvi = es.normalized_diff(arr_st[7], arr_st[3])ep.plot_bands(ndvi, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
土壤调整植被指数 (SAVI)
土壤调整植被指数 (SAVI) 是一种植被指数,它试图使用土壤亮度校正因子来最小化土壤亮度的影响。 这通常用于植被覆盖率低的干旱地区。
SAVI = ((NIR - Red) / (NIR + Red + L)) x (1 + L)L 值根据绿色植被覆盖量而变化。 一般来说,在没有绿色植被覆盖的地区,L=1; 在中度绿色植被覆盖区,L=0.5; 在植被覆盖度很高的地区,L=0(相当于NDVI方法)。 该索引输出介于 -1.0 和 1.0 之间的值。 让我们看看SAVI的实现代码。
L = 0.5savi = ((arr_st[7] - arr_st[3]) / (arr_st[7] + arr_st[3] + L)) * (1 + L)ep.plot_bands(savi, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
可见大气阻力指数 (VARI)
可见大气阻力指数 (VARI) 旨在强调光谱可见部分的植被,同时减轻光照差异和大气影响。 它是 RGB 或彩色图像的理想选择; 它利用了所有三个色带。
VARI = (Green - Red)/ (Green + Red - Blue)vari = (arr_st[2] - arr_st[3])/ (arr_st[2] + arr_st[3] - arr_st[1])ep.plot_bands(vari, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
(6)水体指数
地表水变化是环境、气候和人类活动的一个非常重要的指标。 遥感器,例如 sentinel-2、Landsat,在过去四十年中一直在提供数据,这些数据对于提取土地覆盖类型(例如森林和水)很有用。 研究人员提出了许多地表水提取技术,其中基于指数的方法因其简单性和成本效益而广受欢迎。
修正归一化差水指数 (MNDWI)
修正归一化差异水域指数 (MNDWI) 使用绿色和 SWIR 波段来增强开放水域特征。 它还减少了在其他指数中通常与开阔水域相关的建成区特征。
MNDWI = (Green - SWIR) / (Green + SWIR)下面的代码用于实现 MNDWI,输出如下所示。
mndwi = es.normalized_diff(arr_st[2], arr_st[10])ep.plot_bands(mndwi, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
归一化差异水分指数 (NDMI)
归一化差异水分指数 (NDMI) 对植被中的水分含量很敏感。 它用于监测干旱以及监测火灾多发地区的燃料水平。 它使用 NIR 和 SWIR 波段来创建旨在减轻照明和大气影响的比率。
NDMI = (NIR - SWIR1)/(NIR + SWIR1)让我们看看实现和输出:
ndmi = es.normalized_diff(arr_st[7], arr_st[10])ep.plot_bands(ndmi, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
(6)地质指数
事实证明,卫星图像和航空摄影是支持矿产勘探项目的重要工具。 它们可以以多种方式使用。 首先,它们为地质学家和现场工作人员提供轨道、道路、围栏和居住区的位置。
粘土矿物
Clay Minerals Ratio = SWIR1 / SWIR2cmr = np.divide(arr_st[10], arr_st[11])ep.plot_bands(cmr, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
黑色金属矿产
黑色金属矿物比例突出了含铁材料。 它使用 SWIR 波段和 NIR 波段之间的比率。
Ferrous Minerals Ratio = SWIR / NIRfmr = np.divide(arr_st[10], arr_st[7])ep.plot_bands(fmr, cmap="RdYlGn", cols=1, vmin=-1, vmax=1, figsize=(10, 14))plt.show()
四、结论
本文介绍了数据可视化和归一化植被、水和地质指数等不同方法,以使用 python 分析 Sundarbans 研究区卫星数据。
相关文章:
基于Python 进行卫星图像多种指数分析
一、前言本文帮助读者更好地了解卫星数据以及使用 Python 探索和分析哨兵2卫星数号数据在Sundarbans地区的不同方法。二、Sundarbans研究区孙德尔本斯(Sundarbans)是恒河、雅鲁藏布江和梅克纳河在孟加拉湾汇合形成的三角洲中最大的红树林区之一。 孙德尔…...
(Week 15)综合复习(C++,字符串,数学)
文章目录T1 [Daimayuan]删删(C,字符串)输入格式输出格式样例输入样例输出数据规模解题思路T2 [Daimayuan]快快变大(C,区间DP)输入格式输出格式样例输入样例输出数据规模解题思路T3 [Daimayuan]饿饿 饭饭2&a…...
迪赛智慧数——柱状图(正负条形图):“光棍”排行榜TOP10省份
效果图 中国单身男女最多的省份是广东,广东的人口是全国最多的。人口多了,单身的人也会多,单身女性324万,男性498万。全国第二的省份是四川省,单身女性256万,单身男性296万。 数据源:静态数据…...
IDEA集成chatGTP让你编码如虎添翼
第一步,打开您的IDEA, 打开首选项(Preference) -> 插件(Plugin) 在插件市场搜索 chatGPT, 点击安装 安装完毕后会提示您重启IDE, 重启IDEA. 重启后您会发现窗口,右边条上 竖着挂着个chatGPT按钮了。 第二步、配置APIkey或accessToken(二选一,推荐accessToken无费用…...
Python3 os.close() 方法、Python3 File readline() 方法
Python3 os.close() 方法 概述 os.close() 方法用于关闭指定的文件描述符 fd。 语法 close()方法语法格式如下: os.close(fd);参数 fd -- 文件描述符。 返回值 该方法没有返回值。 实例 以下实例演示了 close() 方法的使用: #!/usr/bin/python3…...
Vision Pro 自己写的一些自定义工具(c#)
目录前言一、保存图片工具1、展示2、源码下载地址二、3D图片格式转化1、展示2、源码下载地址三、所有工具汇总下载地址前言 自己用c#写的一些visionPro自定义工具,便于使用的时候直接拿出来,后续会不断添加新的工具。 想看怎么使用c#写visionPro自定义…...
ARM/FPGA/DSP板卡选型大全,总有一款适合您
创龙科技ARM/FPGA/DSP嵌入式板卡选型大全2023.2版本正式发布!接下来,跟着我们一起看看有哪些亮点吧! 6大主流工业处理器原厂 创龙科技现有30多条产品线,覆盖工业自动化、能源电力、仪器仪表、通信、医疗、安防等工业领域,与6大主流工业处理器原厂强强联合,包括德州仪器…...
【C语言蓝桥杯每日一题】—— 既约分数
【C语言蓝桥杯每日一题】—— 既约分数😎前言🙌既约分数🙌递归版解题代码:😍非递归版解题代码:😍总结撒花💞既约分数😎)😎博客昵称:博客小梦 &…...
【机器学习】线性回归
文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分…...
用ChatGPT学习多传感器融合中的基础知识
困惑与解答: 问题:匈牙利算法中的增广矩阵路径是什么意思 解答: 匈牙利算法是解决二分图最大匹配的经典算法之一。其中的增广矩阵路径指的是在当前匹配下,从一个未匹配节点开始,沿着交替路(交替路是指依次…...
PyCharm2020介绍
PyCharm2020PyCharm2020安装过程PyCharm2020安装包1、PyCharm2020介绍2、PyCharm2020特点3、PyCharm2020特点4、PyCharm2020PyCharm2020安装过程 PyCharm2020安装过程安装步骤点击此链接。 PyCharm2020安装包 链接:https://pan.baidu.com/s/19R3nJx6wMyNBU9oY4N4n…...
Le Potato + Jumbospot MMDVM热点盒子
最近才留意到,树莓派受到编程圈一定瞩目之后,智慧的同胞早已悄咪咪的搞了一堆xx派出来,本来对于香橙派,苹果派,土豆派和香蕉派是不感冒的,但是因为最近树莓派夸张的二级市场价格和断供,终于还是…...
蓝桥杯第19天(Python)(疯狂刷题第2天)
题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…...
(五)手把手带你搭建精美简洁的个人时间管理网站—基于Axure的首页原型设计
🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚 😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...
阿里面试:为什么MySQL不建议使用delete删除数据?
MySQL是一种关系型数据库管理系统,它的数据存储是基于磁盘上的文件系统实现的。MySQL将数据存储在表中,每个表由一系列的行和列组成。每一行表示一个记录,每一列表示一个字段。表的结构由其列名、数据类型、索引等信息组成。 MySQL的数据存储…...
低代码开发公司:用科技强力开启产业分工新时代!
实现办公自动化,是不少企业的共同追求。低代码开发公司会遵循时代发展规律,注入强劲的科技新生力量,在低代码开发市场厚积爆发、努力奋斗,推动企业数字化转型升级,为每一个企业的办公自动化升级创新贡献应有的力量。 一…...
参考mfa官方文档实践笔记(亲测)
按顺序执行以下指令: conda create -n aligner -c conda-forge montreal-forced-alignerconda config --add channels conda-forgeconda activate alignerconda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia 如果报错࿱…...
【 第六章 拦截器,注解配置springMVC,springMVC执行流程】
第六章 拦截器,注解配置springMVC,springMVC执行流程 1.拦截器: ①springMVC中的拦截器用于拦截控制器方法的执行。 ②springMVC的拦截器需要实现HandlerInterceptor或者继承HandlerInterceptorAdapter类。 ③springMVC的拦截器必须在spring…...
一种编译器视角下的python性能优化
“Life is short,You need python”!老码农很喜欢python的优雅,然而,在生产环境中,Python这样的没有优先考虑性能构建优化的动态语言特性可能是危险的,因此,流行的高性能库如TensorFlow 或PyTor…...
太逼真!这个韩国虚拟女团你追不追?
“她们看上去太像真人了”, 韩国虚拟女团MAVE的首支MV和打歌舞台引发网友阵阵惊呼。现在,她们的舞蹈已经有真人在挑战了。 这一组虚拟人的“逼真”倒不在脸,主要是MAVE女团的舞台动作接近自然,不放近景看,基本可以达到…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
