matlab形式のハイパースペクトルイメージ(HSI)をPythonで扱う
はじめに
前の記事では、ENVI形式のHSIデータを扱いました。
HSIのデータはmatlab形式(.mat)も多くあるので、Pythonで.matのHSIデータを扱う方法を書きます。
動作環境
HSIのサンプルデータ
Indian Pinesの.mat形式のデータを使います。
サンプルコード
.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]:
データは16bitでしたが、imshowは8bitに自動で正規化してくれました。