進捗のようなもの

やったこと書きます

matlab形式のハイパースペクトルイメージ(HSI)をPythonで扱う

はじめに

前の記事では、ENVI形式のHSIデータを扱いました。

sjsy.hatenablog.com

HSIのデータはmatlab形式(.mat)も多くあるので、Pythonで.matのHSIデータを扱う方法を書きます。

動作環境

HSIのサンプルデータ

Indian Pinesの.mat形式のデータを使います。

www.ehu.eus

サンプルコード

.matデータの読み込み

In[1]: import scipy.io
In[2]: mat_data =scipy.io.loadmat("./Indian_pines.mat")

In[3]: mat_data
Out[3]:
{'__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Fri May 20 18:20:38 2011',
 '__version__': '1.0',
 '__globals__': [],
 'indian_pines': array([[[3172, 4142, 4506, ..., 1020, 1020, 1005],
         [2580, 4266, 4502, ..., 1029, 1020, 1000],
         [3687, 4266, 4421, ..., 1030, 1016, 1009],
         ...,
         [2570, 3890, 4320, ..., 1021, 1015, 1025],
         [3170, 4130, 4320, ..., 1024, 1020, 1011],
         [3172, 3890, 4316, ..., 1034, 1016, 1015]],
 
        [[2576, 4388, 4334, ..., 1030, 1006, 1015],
         [2747, 4264, 4592, ..., 1039, 1015, 1020],
         [2750, 4268, 4423, ..., 1026, 1015, 1020],
         ...,
         [3859, 4512, 4605, ..., 1035, 1015,  996],
         [3686, 4264, 4690, ..., 1012, 1020, 1014],
         [2744, 4268, 4597, ..., 1019, 1016, 1010]],
 
        [[2744, 4146, 4416, ..., 1029, 1025, 1010],
         [2576, 4389, 4416, ..., 1021, 1011, 1000],
         [2744, 4273, 4420, ..., 1033, 1010, 1014],
         ...,
         [2570, 4266, 4509, ..., 1025, 1010, 1005],
         [2576, 4262, 4496, ..., 1029, 1020, 1005],
         [2742, 4142, 4230, ..., 1025, 1011, 1010]],
 
        ...,
 
        [[3324, 3728, 4002, ..., 1004, 1004, 1000],
         [2983, 3604, 3829, ..., 1013, 1008,  995],
         [2988, 3612, 3913, ..., 1001, 1004, 1003],
         ...,
         [2564, 4115, 4103, ..., 1005, 1013, 1009],
         [2730, 4111, 4103, ..., 1013, 1004, 1004],
         [3156, 3991, 4103, ..., 1014, 1000, 1009]],
 
        [[3161, 3731, 3834, ..., 1000, 1000, 1009],
         [2727, 3742, 4011, ...,  991, 1003, 1000],
         [2988, 4114, 4011, ..., 1008, 1013, 1004],
         ...,
         [3156, 3858, 4016, ..., 1004, 1003, 1009],
         [3159, 3858, 4100, ..., 1000, 1000,  995],
         [2561, 3866, 4003, ..., 1008, 1000, 1003]],
 
        [[2979, 3728, 3732, ..., 1004, 1000,  995],
         [2977, 3728, 3741, ..., 1009,  990, 1013],
         [2814, 3728, 3914, ..., 1009, 1003, 1019],
         ...,
         [3153, 3864, 4282, ..., 1008, 1000, 1009],
         [3155, 4104, 4106, ..., 1005, 1003, 1004],
         [3323, 3860, 4197, ..., 1004, 1000, 1000]]], dtype=uint16)}

'indian_pines'というキーでデータが取り出せることがわかります。

Numpyで読み込む

In[4]: import numpy as np
       HSI_data = np.array(mat_data['indian_pines'])
       HSI_data.shape
Out[4]:
(145, 145, 220)

形も崩れず読み込めていそうです。

画像で確認してみます。

画像の表示

101バンド目の画像を表示

In[5]: import matplotlib.pyplot as plt

       img = HSI_data[:,:,100]
       plt.imshow(img,'gray')
Out[5]: 

f:id:SJSY:20190922120833p:plain

データは16bitでしたが、imshowは8bitに自動で正規化してくれました。