高光谱成像(二)光谱角映射 SAM
高光谱成像二光谱角映射 SAM光谱角映射Spectral Angle Mapping简称 SAM是高光谱图像分析中的一种经典分类与匹配方法。它基于像素光谱与参考光谱之间的角度相似性实现对地物类型的识别。相比其他方法SAM 对光照强度和地形起伏的干扰具有鲁棒性因此在遥感领域得到广泛应用。本文将从光谱角映射的基本概念出发逐步深入讲解其数学原理、实现步骤并通过代码示例演示如何从零实现 SAM 分类。内容设计由浅入深适合初学者到进阶开发者。—## 1. 光谱角映射的基本概念### 1.1 什么是光谱角在高光谱图像中每个像素对应一条光谱曲线该曲线记录了该像素在不同波长下的反射率或辐射值。如果我们将 n 个波段视为 n 维空间那么每个像素的光谱值就是一个 n 维向量。两个光谱向量之间的“角度”可以衡量它们的形状相似性角度越小说明光谱形状越接近角度越大则说明光谱差异越大。光谱角映射正是利用这一特性计算每个像素光谱与参考光谱之间的夹角从而判断像素属于哪一类地物。### 1.2 SAM 的核心优势-对光照强度不敏感因为角度只取决于光谱形状而不受整体亮度缩放的影响。-简单高效无需复杂的训练过程只需提供参考光谱即可。-物理意义明确角度越小光谱越相似直观易懂。—## 2. SAM 的数学原理### 2.1 向量点积与角度设两个光谱向量为a [a₁, a₂, …, aₙ] 和b [b₁, b₂, …, bₙ]则它们之间的夹角 θ 由以下公式计算[\cos(\theta) \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| \cdot |\mathbf{b}|}]其中- (\mathbf{a} \cdot \mathbf{b} \sum_{i1}^n a_i b_i) 是点积- (|\mathbf{a}| \sqrt{\sum_{i1}^n a_i^2}) 是向量模长最终的角度为[\theta \arccos\left( \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| \cdot |\mathbf{b}|} \right)]### 2.2 分类决策对于每个像素计算其与所有参考光谱的角度选择角度最小的参考类别作为该像素的类别。如果最小角度大于某个阈值例如 0.1 弧度则该像素可能不属于任何已知类别视为“未知”。—## 3. SAM 的实现步骤1.准备数据高光谱图像三维数组行 × 列 × 波段和参考光谱二维数组类别数 × 波段。2.归一化处理对每个光谱向量进行归一化只保留方向信息。3.计算角度对每个像素计算其与所有参考光谱的夹角。4.分类为每个像素选择夹角最小的参考类别。5.阈值过滤排除角度过大的像素。—## 4. 代码示例一从零实现 SAM 分类以下代码演示了如何在模拟的高光谱数据上实现 SAM 分类。我们使用 numpy 进行向量化计算以提高效率。pythonimport numpy as npdef sam_classify(image, ref_spectra, angle_threshold0.1): 使用光谱角映射对高光谱图像进行分类 参数: image: 高光谱图像形状为 (rows, cols, bands) ref_spectra: 参考光谱矩阵形状为 (num_classes, bands) angle_threshold: 角度阈值弧度超过此值的像素标记为 -1 返回: class_map: 分类结果形状为 (rows, cols) # 获取图像尺寸 rows, cols, bands image.shape num_classes ref_spectra.shape[0] # 归一化对每个光谱向量除以模长只保留方向 # 处理图像避免除以零 image_norm image / (np.linalg.norm(image, axis2, keepdimsTrue) 1e-10) # 处理参考光谱 ref_norm ref_spectra / (np.linalg.norm(ref_spectra, axis1, keepdimsTrue) 1e-10) # 计算所有像素与所有参考光谱的点积 - 得到余弦相似度矩阵 # 将图像展平为 (rows*cols, bands) 形状 flat_image image_norm.reshape(-1, bands) # 形状: (N, bands) # 点积: (N, bands) (bands, num_classes) (N, num_classes) cos_sim flat_image ref_norm.T # 形状: (N, num_classes) # 将余弦相似度限制在 [-1, 1] 内避免数值误差导致 arccos 出错 cos_sim np.clip(cos_sim, -1.0, 1.0) # 计算角度弧度 angles np.arccos(cos_sim) # 形状: (N, num_classes) # 对每个像素找到最小角度及其对应类别 min_angles np.min(angles, axis1) # 形状: (N,) class_indices np.argmin(angles, axis1) # 形状: (N,) # 应用阈值如果最小角度大于阈值标记为 -1未知 class_indices[min_angles angle_threshold] -1 # 恢复为原始图像形状 class_map class_indices.reshape(rows, cols) return class_map# 示例生成模拟数据np.random.seed(42)rows, cols, bands 10, 10, 20# 模拟图像随机生成一些像素image np.random.rand(rows, cols, bands)# 模拟参考光谱假设有 3 个类别ref_spectra np.array([ [0.5, 0.6, 0.7, 0.8, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8], [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.2, 0.3, 0.4, 0.5], [0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.8, 0.7, 0.6, 0.5]])# 执行分类class_map sam_classify(image, ref_spectra, angle_threshold0.3)print(分类结果10x10 网格)print(class_map)# 输出示例每个数字代表类别索引0,1,2或 -1未知代码说明- 使用np.linalg.norm进行向量归一化。- 通过矩阵乘法一次性计算所有像素与所有参考光谱的余弦相似度。- 使用np.arccos将余弦转换为角度。- 通过阈值过滤将不相似像素标记为 -1。—## 5. 进阶应用与优化### 5.1 并行加速对于大规模高光谱图像例如 1000×1000 像素200 波段上述方法仍然依赖 CPU 串行计算。我们可以利用 GPU 加速如 CuPy或分块处理来提升性能。### 5.2 自适应阈值固定阈值可能不适用于复杂场景。一种改进方法是根据数据分布动态计算阈值例如使用所有像素角度的统计值如 90% 分位数作为阈值。### 5.3 多尺度 SAM在某些应用中需要同时考虑局部和全局光谱特征。多尺度 SAM 通过在不同空间尺度上计算光谱角提高分类的鲁棒性。—## 6. 代码示例二使用光谱角进行图像匹配与可视化以下示例展示了如何在真实高光谱数据使用开源的 Indian Pines 数据集模拟上应用 SAM并可视化分类结果。pythonimport numpy as npimport matplotlib.pyplot as pltdef plot_sam_classification(image, ref_spectra, angle_threshold0.15): 运行 SAM 分类并可视化结果 class_map sam_classify(image, ref_spectra, angle_threshold) # 创建一个彩色分类图 # 假设有 3 个类别分别用红、绿、蓝表示 color_map np.zeros((*class_map.shape, 3), dtypenp.uint8) # 类别 0 - 红色 color_map[class_map 0] [255, 0, 0] # 类别 1 - 绿色 color_map[class_map 1] [0, 255, 0] # 类别 2 - 蓝色 color_map[class_map 2] [0, 0, 255] # 未知类别 - 黑色 color_map[class_map -1] [0, 0, 0] # 显示原始图像选取三个波段模拟 RGB rgb_image image[:, :, [5, 10, 15]] # 假彩色 rgb_image (rgb_image - rgb_image.min()) / (rgb_image.max() - rgb_image.min()) # 归一化到 0-1 plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.imshow(rgb_image) plt.title(原始图像假彩色) plt.axis(off) plt.subplot(1, 2, 2) plt.imshow(color_map) plt.title(SAM 分类结果) plt.axis(off) plt.tight_layout() plt.show()# 生成模拟的高光谱图像类似真实数据np.random.seed(123)rows, cols, bands 50, 50, 30image np.random.rand(rows, cols, bands)# 定义三个参考光谱模拟不同地物ref_spectra np.array([ np.sin(np.linspace(0, np.pi, bands)) 0.5, # 类别 0 np.cos(np.linspace(0, np.pi, bands)) 0.5, # 类别 1 np.exp(-np.linspace(0, 3, bands)) * 0.8 0.2 # 类别 2])# 运行并显示结果plot_sam_classification(image, ref_spectra, angle_threshold0.2)代码说明- 使用假彩色显示原始图像选取三个波段模拟 RGB。- 将分类结果映射为彩色图像便于视觉分析。- 阈值设为 0.2 弧度大于该值的像素视为未知。—## 7. 总结本文从光谱角映射的基本概念出发逐步讲解了其数学原理、实现方法和优化方向。通过两个完整的代码示例我们展示了如何从零构建 SAM 分类器并将其应用于模拟高光谱数据。### 关键要点回顾1.核心思想通过计算光谱向量之间的夹角来衡量相似性角度越小越相似。2.数学基础基于向量点积和 arccos 函数计算简单且物理直观。3.实现技巧利用矩阵运算和归一化避免循环提高效率阈值过滤可处理未知类别。4.应用价值SAM 特别适合光照变化剧烈的遥感场景如卫星影像、无人机高光谱数据分类。### 进一步学习建议- 尝试将 SAM 与机器学习方法如 SVM结合提升分类精度。- 研究光谱角与混合像元分解的关系探索亚像素级分类。- 使用真实高光谱数据集如 AVIRIS、HyMap进行实验熟悉数据预处理流程。希望本文能帮助你掌握 SAM 的核心思想与实现方法为高光谱图像分析打下坚实基础。

相关新闻

网络组播和广播,单播

网络组播和广播,单播

ip addr add 192.168.63.41/24 broadcast 172.28.223.255 dev eth0.63该网段正确的广播地址应该是:192.168.63.255后果:广播地址配置错误,会导致 ARP 广播、DHCP 广播等无法正常工作,可能造成同网段设备无法通信。MAC单播地址给BS…

2026/7/23 20:11:29阅读更多 →
斐讯N1刷OpenWRT打造智能旁路由:内网穿透实现远程SSH管理

斐讯N1刷OpenWRT打造智能旁路由:内网穿透实现远程SSH管理

1. 斐讯N1盒子与OpenWRT系统简介 斐讯N1盒子作为一款性价比极高的硬件设备,在技术爱好者圈子里早已小有名气。这款搭载Amlogic S905D处理器的迷你主机,标配2GB内存和8GB存储空间,支持千兆有线网络和双频WiFi,硬件配置完全能够胜任轻量级路由器的角色。我去年在二手市场以不…

2026/7/23 20:09:29阅读更多 →
资源监控工具:TrafficMonitor、btop、bashtop、bpytop、btop4win、HUATUO

资源监控工具:TrafficMonitor、btop、bashtop、bpytop、btop4win、HUATUO

本文收集几款资源(CPU、网络流量、内存、磁盘等)监控工具,适用于各大主流操作系统。 TrafficMonitor 使用C开发、开源(GitHub,45.3K Star,3.7K Fork)Windows平台电脑资源监控工具。 特性&…

2026/7/23 20:09:29阅读更多 →
Docker镜像操作全流程指南与优化技巧

Docker镜像操作全流程指南与优化技巧

1. 为什么需要整理Docker镜像操作流程上周在给新来的同事做技术培训时,发现他们经常卡在Docker镜像的基础操作环节。每次都要反复解释docker load和docker run的参数含义,这才意识到看似简单的镜像导入运行流程,其实藏着不少新手容易踩的坑。…

2026/7/24 5:19:22阅读更多 →
VS2010集成PC-Lint 9.0i:C/C++静态代码分析的深度配置与工程实践

VS2010集成PC-Lint 9.0i:C/C++静态代码分析的深度配置与工程实践

1. 项目概述:为什么在VS2010时代,PC-Lint依然是C/C开发者的“定海神针”如果你是一位在Windows平台上,尤其是使用Visual Studio 2010进行C/C开发的工程师,那么对“PC-Lint”这个名字一定不会陌生。它不是一个新潮的工具&#xff0…

2026/7/24 5:19:22阅读更多 →
同态加密实战:从Paillier加法同态到BFV全同态,详解编码艺术与工程落地

同态加密实战:从Paillier加法同态到BFV全同态,详解编码艺术与工程落地

1. 项目概述:为什么我们需要同态加密?如果你在数据安全领域摸爬滚打过几年,一定会对“数据孤岛”和“数据可用不可见”这两个词深有感触。我们每天都在处理海量数据,但一个核心矛盾始终存在:数据需要被计算才能产生价值…

2026/7/24 5:19:22阅读更多 →
C++头文件依赖解耦:前向声明与Pimpl实战指南

C++头文件依赖解耦:前向声明与Pimpl实战指南

1. 项目概述:C头文件依赖的“顽疾”与解耦价值在C项目开发中,尤其是当项目规模从几百行增长到几万、几十万行代码时,一个几乎每个开发者都会遇到的“顽疾”就是头文件的相互引用和由此带来的紧密耦合问题。你可能在编译时遇到过“incomplete …

2026/7/24 5:19:22阅读更多 →
Python模拟勒索病毒核心逻辑:从混合加密到文件恢复的攻防实践

Python模拟勒索病毒核心逻辑:从混合加密到文件恢复的攻防实践

1. 项目概述与核心价值最近在安全圈和编程社区里,关于“勒索病毒”的讨论热度一直不低。很多刚入门安全研究的朋友,或者是对Python编程感兴趣的开发者,都对这个听起来有点“黑”的东西感到好奇:它到底是怎么运作的?为什…

2026/7/24 5:19:22阅读更多 →
Unity与Android Studio构建冲突:Gradle版本与中文路径问题深度解析

Unity与Android Studio构建冲突:Gradle版本与中文路径问题深度解析

1. 项目概述:Unity与Android Studio的“爱恨纠葛” 如果你同时使用Unity和Android Studio进行移动端开发,那么“Gradle版本冲突”和“中文路径/编码问题”这两个拦路虎,你大概率已经正面交锋过,或者正在被它们折磨。这绝不仅仅是两…

2026/7/24 5:17:22阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →