第一次接触遥感数据时,我被各种"光谱"搞得晕头转向。直到在项目里实际用过三种数据后,才发现它们的区别就像手机摄像头的不同模式——全色是黑白模式,多光谱是普通彩色模式,而高光谱则是专业模式。
高光谱数据就像把物体放进光谱仪里扫描,每个像素都包含数百个连续波段。去年处理农作物病害检测时,我们用NASA的AVIRIS数据,在550-570nm范围内发现了病害特有的吸收峰,这是普通RGB图像绝对看不到的。这类数据常见的.mat格式需要特殊工具处理,比如ENVI或者Python的spectral库:
python复制import spectral
img = spectral.open_image('indian_pines.hdr')
print(img.bands.centers) # 查看所有波段中心波长
多光谱数据更实用主义,通常只有4-10个离散波段。Landsat-8的11个波段就是典型代表,我常用它的SWIR波段(短波红外)做森林火灾监测。与高光谱相比,它的优势在于数据量小、处理快,适合大范围监测。
全色数据是分辨率最高的单波段数据,相当于把所有可见光压成一个灰度通道。有次做建筑物轮廓提取,WorldView-3的全色数据能达到0.3米分辨率,比多光谱版本清晰4倍。但要注意,全色数据没有光谱信息,通常需要与其他数据融合使用。
Indian Pines是我入门的第一个数据集,这个农业区的144个波段藏着作物类型的秘密。但新手要注意,它的ground truth只有16类,有些类别样本极少会导致分类器过拟合。更复杂的Salinas数据集包含蔬菜大棚场景,波段数相同但空间分辨率更高(3.7米)。
最近发现的宝藏是哈佛大学的真实场景高光谱库,包含50+个室内外场景。有次我测试光谱解混算法时,发现它的实验室场景数据连塑料烧杯的光谱特征都清晰可见。下载时建议选择.mat格式,兼容性最好:
bash复制wget http://vision.seas.harvard.edu/hyperspec/data.zip
CAVE数据集虽然老旧(2007年),但仍是多光谱研究的试金石。它用31个波段(400-700nm)拍摄日常物品,特别适合测试跨光谱重建。我常用它的巧克力照片测试算法——不同可可含量的反射谱差异肉眼可见。
武汉大学RSIDEA平台提供的WHU-Hi数据让我眼前一亮。去年做城市地物分类时,它的130个波段(400-1000nm)加上0.5米分辨率,能清晰区分沥青路面和水泥地。注册账号后可以免费获取部分样本数据。
PanCollection是专门为全色/多光谱融合设计的数据集,包含WorldView-3等6种卫星数据。有次我对比不同融合算法时发现,对0.3米全色数据,Brovey变换速度最快但会丢失光谱信息,而Gram-Schmidt方法更均衡。数据集自带评估指标脚本非常实用:
python复制from pan_collection import qindex
score = qindex(ms_image, fused_image) # 计算融合质量指数
相机的光谱响应就像人眼的色觉——不同相机"看"颜色的方式不同。Nikon D700的响应曲线显示它对绿色特别敏感(峰值在550nm),这解释了为什么用它生成的多光谱数据在植被分析中表现突出。
卫星传感器的响应函数更值得研究。IKONOS的响应曲线在蓝波段(450nm)有明显衰减,这意味着它的水体观测数据需要额外的大气校正。我在处理海岸线变化项目时,用MODTRAN模型补偿了这个缺陷。
做过一个有趣实验:用同一场景的Landsat-8和Sentinel-2数据对比,发现前者的波段11(SWIR)比后者窄12nm。这导致在监测土壤含水量时,Landsat数据对5%以下的水分变化更敏感。
响应函数的带宽还会影响分类精度。测试Pavia大学数据集时,如果把10nm带宽的原始数据重采样到30nm,SVM分类准确率会下降7%。这就是为什么高光谱相机要追求窄波段:
| 带宽(nm) | 分类准确率(%) | 数据量(GB) |
|---|---|---|
| 10 | 92.3 | 4.8 |
| 20 | 88.1 | 2.4 |
| 30 | 85.4 | 1.6 |
全色锐化(Pansharpening)最考验对响应函数的理解。WorldView-3的全色波段范围(450-800nm)与多光谱波段不重合,直接融合会导致色彩失真。我的解决方案是用响应函数加权:
python复制def weight_by_response(pan, ms, response_curve):
return np.sum(ms * response_curve[:,None,None], axis=0) / np.sum(response_curve)
这个方法在城区场景测试中,将融合图像的QNR指标提升了0.15。关键是要从卫星厂商获取精确的响应曲线数据,有些需要签署保密协议才能获得。
农作物病害检测首选高光谱数据,但要注意波段范围要覆盖病害特征区。去年检测小麦条锈病时,发现710-720nm的"红边"区域最关键。如果预算有限,Sentinel-2的波段8A(865nm)也能勉强替代。
做土地利用分类时,多光谱数据性价比更高。有个省钱的技巧:用Landsat-8的30米数据做初步分类,再用无人机RGB影像局部修正,比直接买高光谱数据节省90%成本。
处理哈佛数据集时踩过坑——它的DN值需要转换为反射率。正确的流程是:先读原始数据,再用白板校准数据转换,最后做大气校正。ENVI的QUAC模块能自动完成,但手动操作更可控:
python复制def dn_to_reflectance(dn, dark_current, white_reference):
return (dn - dark_current) / (white_reference - dark_current)
另一个常见问题是波段配准。天宫一号数据各波段间存在1-2像素偏移,用OpenCV的findTransformECC函数可以精确校正,但要注意设置合适的插值方法。
高光谱数据很快会撑爆内存。处理Indian Pines时,我改用HDF5格式分块存储,内存占用从16GB降到3GB。Python的h5py库操作很方便:
python复制with h5py.File('data.h5', 'r') as f:
chunk = f['image'][100:200, 100:200, :] # 按需读取数据块
对于GPU计算,建议将数据预处理为TFRecord格式。测试表明,这样能使TensorFlow的训练速度提升2-3倍,特别是当波段数超过100时。