1. 程式人生 > >[轉載]matlab高光譜影像讀取、保存、分塊

[轉載]matlab高光譜影像讀取、保存、分塊

nvi blank cloud 說明 byte matlab spa ltib 無法顯示

原文地址:matlab高光譜影像讀取、保存、分塊作者:wind_靜水流深_cloud

高光譜影像由於含有近百個波段,用matlab自帶的圖像讀寫函數imread和imwrite往往不能直接操作,以下針對高光譜影像讀取、保存圖像數組以及影像分塊予以說明:

影像讀取:

利用multibandread函數,此函數用於讀取多波段二進制影像文件。至於何為二進制影像文件,簡單地說ENVI主菜單file—save file as—envi standard得到的就是二進制影像文件,有時甚至會看到後綴名為bsq、bil、bip等影像,也是二進制影像文件。

對於一幅tif格式的高光譜影像,這裏有兩種方法將影像讀入matlab:

(1)直接利用imread函數讀取,不知為何tif格式的高光譜影像居然可以讀取,但是速度挺慢

(2)利用multibandread函數讀取,建議首先利用envi將tif格式轉換為envi標準格式(如何轉換上文有),至於為什麽轉換,原因在於這個函數是用來讀取二進制影像的,若直接讀取tif格式的影像雖然能夠成功但是有些波段卻變得模糊了,顯得該波段信息量很少了,轉換格式後不會出現這問題了(這是在實驗中發現的,不知怎麽解釋)。

(3)利用下面鏈接裏提供的程序

註意:利用該函數需要設置很多參數,參數是從頭文件裏找的,對於沒有頭文件的影像怎麽辦?解決方法:打開影像後,利用envi編輯頭文件的功能會生成一個“簡單的頭文件”,這裏面會包含波段數、行數、列數以及影像類型(bsq、bip、bil)等,總之生成的這個並非嚴格意義頭文件的文件可滿足利用multibandread讀取影像時參數設置。

其中multibandread中precision參數與matlab數據類型相應的關系如下所示:

precision=‘uint8=>uint8‘;%頭文件中datatype=1對應ENVI中數據類型為Byte,對應MATLAB中數據類型為uint8

precision=‘int16=>int16‘;%頭文件中datatype=2對應ENVI中數據類型為Integer,對應MATLAB中數據類型為int16

precision=‘uint16=>uint16‘;%頭文件中datatype=12對應ENVI中數據類型為Unsighed Int,對應MATLAB中數據類型為uint16

precision=‘int32=>int32‘;%頭文件中datatype=3對應ENVI中數據類型為Long Integer,對應MATLAB中數據類型為int32

precision=‘uint32=>uint32‘;%頭文件中datatype=13對應ENVI中數據類型為Unsighed Long,對應MATLAB中數據類型為uint32

precision=‘float32=>float32‘;%頭文件中datatype=4對應ENVI中數據類型為Floating Point,對應MATLAB中數據類型為float32

precision=‘double=>double‘;%頭文件中datatype=5對應ENVI中數據類型為Double Precision,對應MATLAB中數據類型為double

對於ENVI標準格式的數據,除了multibandread函數外,網上有公布的程序專門讀取ENVI標準格式影像(利用fread和fwrite函數進行二進制文件讀寫),但註意需提供頭文件。代碼鏈接:

http://download.csdn.net/detail/hyperspectral/2761545

http://www.mathworks.cn/matlabcentral/fileexchange/15629-envi-file-reader-updated-292010

註意:使用別人的程序要致謝或者引用相關文獻,註意節操!!

影像保存:

這裏也給出幾種方法:

(1)還是利用imwrite,只不過每次保存一個波段,當然3個波段也是可以的

(2)利用multibandwrite函數,該函數與multibandread函數相對應,所以它是將圖像數組保存為二進制圖像(bsq、bil、bip),該函數可以直接將所有波段一起保存,調用實例:

multibandwrite(D,‘asd‘,‘bsq‘,‘machfmt‘,‘ieee-le‘,‘precision‘,‘int16‘)

其中D為讀進matlab的圖像數組,asd是保存後的文件名,bsq是波段存儲方式。

‘machfmt‘和‘precision‘兩個參數很重要,一定要寫上,分別表示寫入文件asd的數據格式以及精度,可從頭文件找到,缺少這兩個參數影像無法顯示。

(3)利用上面鏈接裏提供的程序

影像分塊:

這裏面的關鍵問題還是在於保存多波段圖像數組,有以下幾種方法:

(1)很笨的方法就是每個波段單獨分塊,用imwrite函數保存圖像數組為分塊圖像,最後將相應的圖像塊組合,可能存在的問題是有些波段影像沒有信息,這是由於數據類型高精度向低精度轉化丟失信息。例如,有些影響讀進matlab後數據類型為int16,而imwrite函數不支持該類型,調用函數時需進行類型轉化,高精度向低精度轉化必然損失信息。

(2)對於不需要顯示分塊的影像,當然可以直接將所有波段一起分塊,保存為mat格式

(3)利用multibandwrite函數,分塊的所有波段可以直接保存,需提供頭文件。

(4)利用上面鏈接裏提供的程序

總之一句話,對於高光譜影像有了頭文件讀、寫等工作就變得很簡單了,如果沒有頭文件就比較麻煩

[轉載]matlab高光譜影像讀取、保存、分塊