在光学遥感中,阴影是影响土地覆盖制图精度和分辨率的一个因素,无论是历史影像(黑白影像)还是近期影像(全彩影像)。阴影的产生取决于太阳光照(太阳方位角和天顶角)、相机视点(海拔)以及地形(坡度和坡向)。为了最大限度地减少阴影对土地覆盖制图的影响,需要探索处理阴影区域的方法,以提高植被覆盖制图的精度,并进一步进行变化检测。

在遥感领域,人们通常将此过程称为“地形校正”,但本文中的阴影去除与地形校正略有不同。地形校正旨在减少甚至消除地形对成像的影响。而阴影去除仅考虑阴影区域,并重新计算那些更接近“无”阴影状态的区域像素,因此一些带有较暗像素的丘陵地带仍然会“保留”。

基于计算机视觉方法的阴影去除迭代处理

阴影的来源

正如简介中提到的,阴影的来源如下:

  • 太阳光照(太阳方位角和天顶角)

测量几何:太阳天顶角(SZA)、观测天顶角(VZA)和相对方位角(RAA)

  • 相机视点(海拔)
  • 地形(坡度和坡向剖面)

地形和太阳角度造成的山体阴影

典型的遥感阴影去除方法

遥感影像中的典型方法是利用数字地形模型模拟坡度和坡向,从而确定阴影区域,然后对坡度和坡向进行归一化处理,进行明纳尔特校正。明纳尔特校正后,最后一步是估算与周围像素的系数,从而去除航空影像中的阴影。

使用 ArcGIS Pro 完成的示例

然而,模拟的太阳角度(方位角和天顶角)以及米纳尔特校正等参数可能无法有效地推导出并消除丘陵地形的阴影(如图所示)。因此,另一种方法是使用多源数据组合或熵估计(由谷歌开发)来消除阴影。

谷歌开发的熵估计方法

成像中的光照变化会增加观察到的纹理强度的熵,而成像中的纹理又会增加光照函数的熵。如果我们想要分离图像及其纹理和光照,可以通过最小化每个分量的熵来实现。最小化一个分量可以简单地将整个能量转移到其他分量。对光照熵的约束起到了正则化的作用,并赋予其平滑性。

采用基于非参数核的二次熵公式来估计纹理和光照密度。它可以有效地执行多尺度迭代优化算法,以最小化最终的能量函数。该方法特别适用于包含独特纹理图案(例如建筑物立面)或具有较大漫射区域的软阴影(例如云阴影)的航空图像。

图像分量分离的方法
将观测图像I(x,y)分离为其纹理分量R(x,y)和光照分量L(x,y)。

假设图像 I 可以表示为这两个分量的总和:

I(x,y)= L(x,y)+ R(x,y)。

纹理成分表示图像中的底层纹理图案,而照明成分表示整体照明条件。

熵公式:
熵是衡量随机变量不确定性或随机性的指标。作者观察到,任何光照变化都会增加观察到的纹理强度的多样性(熵),而纹理的存在又会增加光照函数的熵。因此,他们利用熵的概念来公式化图像成分的分离。

随机变量X的熵表示为H(X)。

在这种情况下,作者考虑了观察到的图像 I、纹理分量 R 和照明分量 L 的熵。他们指出,观察到的图像 I 的熵大于或等于其分量的熵:

H(I)≥H(R),H(L)

这个不等式表明,通过最小化纹理和照明成分的熵,可以降低观察到的图像的整体熵。

<此图来自 Kwatra, Vivek & Han, Mei & Dai, Shengyang. (2012)> 从左到右:原始图像、无阴影蒙版、去除阴影后的图像、计算出的阴影图、局部裁剪前后的放大图(红色)和放大图(橙色)。上行使用用户自定义蒙版,下行使用自动蒙版

多源数据融合

通过整合来自多个来源的数据,例如卫星图像和航拍照片,可以获得更多信息来去除阴影。不同的数据源可能捕捉场景的不同方面,而这些数据源的组合可以提供对阴影模式和特征的更全面的理解。多源数据融合可以整合互补信息,从而提高阴影去除的准确性。

<此图来自 Dare, Paul. (2005)> 左边是原始卫星图像,右边是处理后的图像

基于图像处理的阴影去除方法

目前已经有一些阴影去除算法可以用来追踪和去除这些阴影区域,例如“图像阴影去除器”。这个 Python 包使用了 Murali、Saritha 和 VK Govindan 的方法进行阴影检测和去除。

对于阴影检测,他们首先将 RGB 图像(波段)转换到 LAB 颜色空间,阴影像素在 L 和 B 通道中的值都很低。因此,如果 L < T1 且 B < T2(其中 T1 和 T2 为阈值),则将像素分类为阴影,并应用形态学运算来优化阴影蒙版。此后,他们仅保留尺寸 > T3 的阴影区域以消除错误分类。此外,对于阴影去除,每个识别出的阴影区域如下:

  • 计算阴影区域内的平均 R、G、B 值:Rin、Gin、Bin
  • 计算阴影区域外的平均 R、G、B 值:Rout、Gout、Bout
  • 计算每个通道的常数:

KR = Rout/Rin,KG = Gout/Gin,KB = Bout/Bin

  • 将阴影区域中的每个像素乘以相应的常数:

R' = KR * R
G' = KG * G
B' = KB * B

这会缩放阴影区域的颜色通道,使其与阴影外部的光照水平匹配。对于后期处理来说,阴影边缘附近的像素不如阴影内部像素暗。此外,将这些边缘像素乘以常数可能会导致它们过度照明,最终对边缘像素应用中值滤波以消除这种过度照明。

image_shadow_remover,阴影去除算法的实现,下载image_shadow_remover的源码_GitHub_帮酷

阴影去除算法的实现。通过创建…为 YalimD/image_shadow_remover 开发做出贡献。

github.com

上排为原图,下排为去除阴影后的图像(Ma On Shen 样本)

航拍图像(左为原始图像,右为后期处理图像),大帽山样本

航拍图像(左为原始图像,右为后期处理图像),马鞍山样本

总体而言,基于图像处理的方法效果显著,其结果优于基于遥感的方法,例如多源数据融合、C系数校正或Minnaert校正。然而,为了更好地解读历史航拍图像,以便更好地进行植被覆盖制图和长期变化检测,增强和改进阴影去除效果仍有很长的路要走。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88145.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88145.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88145.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE material advance 学习笔记

如何体现轮胎速度的快速感&#xff1a;就是增加一个radial blur&#xff0c;会让视觉效果感觉轮胎已经转冒烟了&#xff0c;但是上面两个轮胎的转速其实是相同的这种磨砂的感觉&#xff0c;可以用上ditherAA来实现只看法线这一块&#xff0c;ditherAA就是让他的表面颜色有大量的…

Vue--2、Vue2 项目配置与组件化开发

一、Vue2 项目环境搭建1. 环境准备安装 Node.js&#xff1a;推荐使用 nvm 管理多版本 Node# 安装Node 16.20.2 nvm install 16.20.2 # 切换至指定版本 nvm use 16.20.2 # 验证安装 node -v && npm -v安装 Vue CLI 脚手架&#xff1a;# 国内镜像源安装 npm install --re…

虚幻基础:函数的返回节点

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录函数的返回节点&#xff1a;返回执行后的值返回执行后的值若不执行第一次 返回参数的默认值第二次 返回上一次执行值示例函数的返回节点&#xff1a;返回执行后的值 返回执行后的值 若不执行 第一次 返回参数的默…

FFmpeg 升级指北

近期我参与了部门底层库依赖的 FFmpeg 从 3.4 升级至 7.0.2 的工作&#xff0c;在此分享一些经验和遇到的 API 变动。 将 FFmpeg 升级到高版本后&#xff0c;编译过程中遇到大量报错是常态。这些错误通常源于 API 接口变更或结构体字段调整。此时不必惊慌&#xff0c;核心解决…

RISCV Linux 虚拟内存精讲系列三 -- setup_vm()

在 Linux 使用虚拟地址前&#xff0c;需要先配置页表&#xff0c;这就是 setup_vm() 的作用。然而&#xff0c;Linux 的页表配置&#xff0c;并不是一次过完成的&#xff0c;分了两个阶段&#xff0c;如下&#xff1a;在 setup_vm() 中&#xff0c;主要初始化了&#xff1a;1. …

创客匠人:解析创始人 IP 打造的底层逻辑与知识变现路径

在数字经济时代&#xff0c;创始人 IP 的价值被不断放大&#xff0c;而知识变现作为 IP 商业闭环的核心环节&#xff0c;正成为无数创业者探索的方向。创客匠人深耕知识付费领域多年&#xff0c;见证了大量创始人从 0 到 1 打造 IP 并实现变现的全过程&#xff0c;其背后的逻辑…

Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示

主要步骤&#xff1a;在主框架类中添加消息处理函数声明在 OnCreate 函数中启用工具栏提示在消息映射中注册 TTN_NEEDTEXT 消息使用 OnToolTipText 函数实现自定义提示文本1.在主程序的.h文件中加入afx_msg BOOL OnToolTipText(UINT id, NMHDR* pNMHDR, LRESULT* pResult); 2.在…

2025Q2大模型更新汇总(大语言模型篇)

摘要 2025年Q2大语言模型更新汇总&#xff1a; Qwen3&#xff0c;Deepseek-R1-0528&#xff0c;Doubao-Seed-1.6, MiniMax-M1, GPT4.1/O3/O4&#xff0c;Claude4/Gemini2.5 Qwen3 • 开源MOE模型&#xff0c; • MOE模型&#xff1a;Qwen3-235B-A22B&#xff0c;Qwen3-30B-…

【STM32】定时器中断 + 含常用寄存器和库函数配置(提供完整实例代码)

通用定时器基础知识 参考资料:STM32F1xx官方资料:《STM32中文参考手册V10》-第14章通用定时器 通用定时器工作过程: 时钟选择 计数器时钟可以由下列时钟源提供: ① 内部时钟(CK_INT) ② 外部时钟模式1:外部输入脚(TIx) ③ 外部时钟模式2:外部触发输入(ETR) ④ 内部触…

集群Redis

文章目录前言一、Redis主从复制配置1.1.配置文件redis_master.conf,redis_slave.conf1.2.启动服务1.3.检查成果二、Redis集群配置2.1.服务器40.240.34.91集群配置2.2.其它服务器xxx.92,xxx.93集群配置2.3.启动服务2.3.启动集群服务2.4.检查成果三、优劣四、结束前言 提示&…

ORA-600 kokiasg1故障分析---惜分飞

故障总结:客户正常关闭数据库,然后启动报ORA-600 kokiasg1错误,通过对启动分析确认是由于IDGEN1$序列丢失导致,修复该故障之后,数据库启动成功,但是后台大量报ORA-600 12803,ORA-600 15264等错误,业务用户无法登录.经过深入分析,发现数据库字典obj$中所有核心字典的序列全部被删…

[RPA] 影刀RPA基本知识

1.应用的构成一个应用&#xff1a;由多条指令叠加组成一条指令代表了一个操作动作许多条指令按照一定的逻辑关系编排起来&#xff0c;就构成了一个应用(这里的应用可理解为软件机器人RPA)一个应用 多个自动化指令的集合 2. 指令的一般构成在XXX对象上&#xff0c;对XXX元素执行…

pytest中测试特定接口

在pytest中只测试特定接口有以下几种常用方法&#xff1a; 1. 通过测试函数名精确匹配 直接指定测试文件和函数名&#xff1a; pytest test_api.py::test_upload_image_with_library这将只运行test_api.py文件中名为test_upload_image_with_library的测试函数。 2. 使用关键字匹…

HMI图形渲染优化:OpenGL ES与Vulkan的性能对比实战

HMI 图形渲染优化&#xff1a;OpenGL ES 与 Vulkan 的性能对比实战**摘要想让 HMI 界面的图形渲染又快又流畅&#xff0c;却在 OpenGL ES 和 Vulkan 之间纠结不已&#xff01;用 OpenGL ES&#xff0c;担心性能不够强劲&#xff0c;无法满足复杂场景需求&#xff1b;选 Vulkan&…

Python数据分析基础01:描述性统计分析

下一篇&#xff1a; 《Python数据分析基础04&#xff1a;预测性数据分析》 《Python数据分析基础03&#xff1a;探索性数据分析》 《python数据分析基础02&#xff1a;数据可视化分析》 《Python数据分析基础01&#xff1a;描述性统计分析》 描述性统计分析是统计学中最基…

成员不更新项目进度,如何建立进度更新机制

项目成员不及时更新进度的主要原因包括责任不明确、缺乏更新规则、沟通机制不畅、进度意识薄弱、工具使用不当等。其中尤其需要关注的是建立清晰的进度更新规则。明确规定成员应何时、如何、向谁汇报进度情况&#xff0c;使得项目的每项任务都有责任人和明确的更新频率及形式&a…

JVM 整体架构详解:线程私有与线程共享内存区域划分

Java 虚拟机&#xff08;JVM&#xff09;作为 Java 程序运行的基础&#xff0c;其内存模型和线程结构设计直接影响着程序的执行效率和稳定性。本文将从 线程是否共享 的角度出发&#xff0c;对 JVM 的整体内存结构进行清晰分类与简明解析。一、JVM 内存区域划分概览 根据是否被…

【Linux庖丁解牛】— 库的理解与加载!

1. 目标文件编译和链接这两个步骤&#xff0c;在Windows下被我们的IDE封装的很完美&#xff0c;我们⼀般都是⼀键构建⾮常⽅便&#xff0c; 但⼀旦遇到错误的时候呢&#xff0c;尤其是链接相关的错误&#xff0c;很多⼈就束⼿⽆策了。在Linux下&#xff0c;我们之前也学 习过如…

QML事件处理:鼠标、拖拽与键盘事件

在QML应用开发中&#xff0c;用户交互是构建动态界面的核心。本文将全面解析QML中的三大交互事件&#xff1a;鼠标事件、拖拽事件和键盘事件&#xff0c;通过实际代码示例展示如何实现丰富的用户交互体验。一、鼠标事件处理1. MouseArea基础MouseArea是QML中处理鼠标交互的核心…

MySQL 8.0 OCP 1Z0-908 题目解析(20)

题目77 Choose the best answer. Which step or set of steps can be used to rotate the error log? ○ A) Execute SET GLOBAL max_error_count . ○ B) Rename the error log file on disk, and then execute FLUSH ERROR LOGS. ○ C) Execute SET GLOBAL log_error ‘’…