正如上图表示的那样,高光谱则是由很多通道组成的图像,具体有多少个通道,这需要看传感器的波长分辨率,每一个通道捕捉指定波长的光。把光谱想象成一条直线,由于波长分辨率的存在,每隔一定距离才能“看到”一个波长。“看到”这个波长就可以收集这个波长及其附近一个小范围的波段对应的信息,形成一个通道。也就是一个波段对应一个通道。注意对图中土壤的高光谱图像,如果我们沿着红线的方向,即对高光谱上某一个像素的采样,就可以针对此像素生成一个“光谱特征”。
高光谱中hdr文件的含义
# ENVI
# samples = 800(图像列数)
# lines = 703(图像行数)
# bands = 128(波段数)
# header offset = 0
# file type = ENVI Standard
# data type= 12(数据类型)
# interleave = bil(数据组织方式即存储格式)
# sensor type = Unknown
# wavelength units = nm
# binning = {1,8}
interleave = bil:在BIL组织方式下,raw存储数据方式是按行存放,会先存储第一行所有波段的反射率,而后是第二行所有波段的反射率,以此类推。我的数据为800*703*128。下方代码是将高光谱数据根据dhr文件格式转化为多通道的图片格式,图片长为800,宽为703,通道数为128维。
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
imagePath = r"E:\2,13\2,13\random_leaf_ref.raw"
print(type(imagePath))
rawImage = np.fromfile(imagePath,"flo32")
print(type(rawImage))
rawShape = rawImage.shape
print(rawShape)
formatImage = np.zeros((703,800,128))
for row in range(0,703):
for dim in range(0,128):
formatImage[row,:,dim] = rawImage[(dim + row*128) * 800:(dim + 1 + row*128)* 800]
#选择通道数为12/46/96的三个通道相当于rgb三通道的图片
imgR = formatImage[:,:,12]
imgG = formatImage[:,:,46]
imgB = formatImage[:,:,96]
rgbImg = cv.merge([imgR,imgG,imgB])
print(rgbImg.shape)
print(type(rgbImg))
cv.imshow('test',rgbImg)
cv.waitKey()
高光谱图片显示