在该专栏上一篇文章中,简单介绍了一些高光谱图像的一些知识。HSI图像的最明显的一个特点就是光谱波段非常多,光谱信息极为丰富。但是有些波段在实际应用中并非是我们所需要的,那么怎么对HSI中的波段进行指定提取,选择我们所需的波段?
使用ENVI
- 首先使用打开原始HSI,选择【file】->【Save as】->【Save as…】
- 选择【Spectral Subset…】后,在该窗体中会显示当前HSI影像中的所有波段。比如,我们需要Band1,选择【Band 1(410.7270)】后点击【ok】
- 最后,选择输出影像目录和输出格式,这里我们选择了TIFF格式。
使用脚本批量处理
由于工作需要,这里我需要将HSI影像中的所有波段一一提取出来,这里我们使用了idl语言编写的脚本程序。
(工具下载链接:)。
(注:下面2和3顺序调换一下,第一次编辑时没有发现这个错误,这里特此纠正)
将img格式转为tif格式
使用该工具对所有波段的提取生成的文件格式为img,但是由于工作需要,必须要将img格式的影像转为tif格式。下面继续使用idl语言脚本进行转换。
PRO img_to_tif
COMPILE_OPT idl2 ;改变idl中默认设置
ENVI, /RESTORE_BASE_SAVE_FILES ;恢复ENVI Sav文件
ENVI_BATCH_INIT ;开始批处理
filePath = 'E:test' ;原始文件路径
inputFiles = DIALOG_PICKFILE(title = '添加文件', filter = '*.img', $
path = filePath, /fix_filter, /multiple_files) ;批量添加数据
nFiles = N_ELEMENTS(inputFiles) ;文件个数
FOR i = 0L, nFiles-1 DO BEGIN ;循环开始
ENVI_OPEN_FILE, inputFiles[i], R_FID=fid, $
/NO_INTERACTIVE_QUERY ;打开文件
IF fid EQ -1 THEN RETURN ;判断是否打开文件
ENVI_FILE_QUERY, fid, NB=nb, DIMS=dims, NL=nl, NS=ns, $ ;查询图像信息
INTERLEAVE=interleave, DATA_TYPE=data_type
fileName = FILE_BASENAME(inputFiles[i]) ;获取文件名字
outFileDir = FILE_DIRNAME(inputfiles[i], /MARK_DIRECTORY) ;文件输出路径
pointPos = STRPOS(fileName, '.', /REVERSE_SEARCH) ;倒序寻找文件名中.的位置
IF pointPos[0] NE -1 THEN BEGIN
fileName = STRMID(fileName, 0, pointPos) ;获取文件名字
ENDIF
out_name = outFileDir + fileName+'_t.tif'
bnames = 'band '+STRCOMPRESS(STRING(INDGEN(nb)+1), /REMOVE_ALL) ;波段名字
ENVI_SETUP_HEAD, FNAME = out_name, BNAMES = bnames, $
FILE_TYPE = ENVI_FILE_TYPE('TIFF'), DATA_TYPE = data_type, $
INTERLEAVE = interleave,NB = nb, NL = nl, NS = ns,/WRITE ;创建头文件
ENVI_OUTPUT_TO_EXTERNAL_FORMAT, OUT_NAME = out_name, $
FID = fid,DIMS = dims, POS = INDGEN(nb), $
OUT_BNAME = bnames, /TIFF ;img转tif格式
ENDFOR
tmp = DIALOG_MESSAGE('img to tif 结束', /info) ;结束
END
- 将以上代码拷贝到idl编辑器中(若输出的文件有问题,点重置再运行)
- 点击运行,此时会弹出选择文件窗口,这里选择需要转换的img格式影像(该脚本支持批量转换,可以一次选择多个img格式影像)
- 点击ok,开始执行脚本,等待执行结束,会弹出转换完成的提醒。