ケイエルブイは、ハイパースペクトルカメラ・光学部品・光源など世界中の光学機器を取り扱う専門商社です。

03-3258-1238

お問い合わせ
KLV大学 ハイパースペクトルカメラコース
spectral-analysis-python-top.jpg

Python×スペクトル解析
[1.1] Pythonでスペクトルデータを読み込んでみる

スペクトル解析のPythonプログラム_スペクトルデータの読み込み

ハイパースペクトルカメラで撮影したデータは、数百バンドもの波長情報を持つ“スペクトルのかたまり”です。
これらのデータは、多くの場合 ENVI 形式(.hdr + .raw) で保存され、ヘッダファイル(.hdr)に撮影条件や波長情報、本体ファイル(.raw)にピクセル値が格納されています。
解析を始めるには、まずこの ENVI 形式を正しく読み込むことが必要です。

本記事では、Python のハイパースペクトル解析ライブラリ Spectral Python (SPy) を使い、.hdr ファイルを指定してハイパースペクトルデータを読み込む基本的な方法をサンプルコードを交えながら紹介します。

1. スペクトルデータのENVI 形式とは

ハイパースペクトル画像の分野では、ENVI 形式が事実上の標準フォーマットとして利用されています。 スペクトルカメラで撮影した画像は、一般的にこのフォーマットで保存されます。

ENVI形式のスペクトルデータは、 画像の構造や波長情報などのメタデータを記述したヘッダファイルである.hdrファイルと、 実際の画素値を格納したデータ本体ファイルである.raw ファイルの2つで構成されます。

ENVI形式のスペクトルデータ

.hdr はテキスト形式で、行数(lines)、列数(samples)、バンド数(bands)、データ型(data type)、波長(wavelength)、.rawファイルのパス(data file)などが記載され、解析ソフトはこれを読み取ってデータの概要を理解します。

一方、.rawはバイナリ形式で、ヘッダに基づいた並び順で全ピクセルのスペクトル情報が保存されています。

ENVI 形式を読み込む場合は、.hdr ファイルを指定します。 Python のSpectral Python (SPy)に .hdr を指定すると、.rawファイルのパスや .raw の構造を理解してスペクトルデータとして読み込みます。
たとえば、spy.open_image('image.hdr')とプログラムに記述すれば、SPy が .hdr 内の data file で指定された .raw を参照し、自動的に正しい形に展開してくれます。

2. Spectral Python (SPy) とは

Spectral Python (SPy)は、ハイパースペクトル画像/マルチスペクトル画像をPythonで処理するためのオープンソースライブラリです。

Spectral Python公式ページ(https://www.spectralpython.net)

スペクトル画像データの読み込み・表示、スペクトル解析機能を備えています。
今回注目するスペクトル画像のデータ読み込みでは、今回取り上げるENVI形式(.hdr + .raw)に加えて、AVIRIS、ERDAS/Lanなどのフォーマットにも対応します。

open_image() 関数を使うことで、ファイルの .hdr 情報を適切に認識し、スペクトル情報を NumPy配列と同じ操作ができるオブジェクトに取り込むことが可能です。
読み込んだスペクトルデータは、形状が (rows, cols, bands)の3次元配列 として得られます。
rows は行数、cols は列数、bands は波長チャンネル数を表し、この構造により arr[:, :, band]で特定波長の画像、arr[row, col, :]で特定ピクセルのスペクトルを取得できます。

これらの機能により、SPyは、ハイパースペクトルデータでも効率的に扱えるツールとなっています。

Spectral Python (SPy) のインストール

インストール方法

PyPI(Python Package Index)から1コマンドで簡単にインストールできます。

ターミナル(またはコマンドプロンプト)を開き、次のコマンドを実行します。

pip install spectral

このコマンドにより、 SPy の本体と必要な依存パッケージ(NumPy など)が自動的にインストールされます。

インストールの確認方法

SPy が正しくインストールできたかを確認するには、Pythonから直接モジュールを読み込み、バージョンを表示します。

①Pythonを起動する

ターミナルやコマンドプロンプトでPythonを実行し、インタラクティブモードに入ります。

python

または、

python3

を入力

②モジュールをインポートする

import spectral

エラーがでなければ、モジュールが正しく認識されています。

③バージョン番号を表示する

print(spectral.__version__)

実行結果として、# 0.23.1 のようにバージョン番号が表示されれば、インストールが成功しています。

3. スペクトルデータ読み込み

スペクトルデータ読み込みサンプルコード


import spectral

# .hdr ファイルのパスを指定
hdr_path = '/path/spectral_data.hdr'

# 画像を開く(SpyFileオブジェクト)
img = spectral.open_image(hdr_path)

# 全データを NumPy互換配列として読み込み
data = img.load()

print("画像サイズ:", data.shape)  # (rows, cols, bands)
print("データ型:", data.dtype)

上記のコードは、インストールしたSpectral Python (SPy) を使ってハイパースペクトル画像を読み込む最小限の処理を行うサンプルコードです。

まず、hdr_path で指定した .hdr ファイルを spectral.open_image() 関数に渡し、画像の SpyFile オブジェクトを作成します。
この時点では実データのメモリへの読み込みはおこなわれておらず、ヘッダ情報から画像サイズやデータ構造のみが認識された状態です。

次に、img.load() を実行することで、対応するデータ本体(通常は .raw など)をすべてメモリに展開します。
結果は NumPy互換の ImageArray として返され、データ型は32ビット浮動小数点(float32)、形状は (rows, cols, bands) です。
そのため、 データのshape と dtype を表示すると、以下のように読み込んだ配列のサイズとデータ型を確認することができます。


画像サイズ: (798, 900, 300)
データ型: float32

上記のコードはファイルの読み込みと基本情報の確認のみであり、スペクトルの可視化や解析の前段階として使えるシンプルなサンプルです。

4. 大規模スペクトルデータの読み込み

ハイパースペクトルデータは数百バンドの画像が数千×数千ピクセル分あり、ファイルサイズが数GB〜数十GBに達することも珍しくありません。

全バンド・全画素を一度にメモリへ読み込むと、メモリ消費量は ”4 × 行数 × 列数 × バンド数 [bytes]”となり、容量不足や処理遅延の原因になります。
このような場合には、load() を使わず、以下のようなコマンドを用いて必要な部分だけを読み込む方法が有効です。

  • read_band():単一バンドの情報を取得
  • read_pixel():特定座標のスペクトルを取得
  • read_subregion():指定した行・列範囲とバンド範囲の部分配列を取得

これらの機能を使用することにより、大容量データでも最小限の読み込みでメモリ使用量を大幅に削減することができます。

大容量スペクトルデータ読み込みのサンプルコード


import spectral

hdr_path = '/path/spectral_data.hdr'
img = spectral.open_image(hdr_path)

# 例1: 第10バンドのみ読み込み
band10 = img.read_band(10) 

# 例2: ピクセル (100, 200) のスペクトルの読み込み
spectrum = img.read_pixel(100, 200) 

# 例3: 一部領域(行100-199, 列200-299)のバンド10〜19を読み込み
roi = img.read_subregion((100, 200), (200, 300), bands=range(10, 20))
print(roi.shape)  # (100, 100, 10)

5. スペクトルデータの読み込みのまとめ

本記事では、Spectral Python (SPy) によるハイパースペクトルデータの読み込みを解説しました。

ENVI形式(.hdr + .raw)を中心に、open_image()によるファイルの開き方、load() による全読み込み、read_*()による部分読み込みが簡単にできることを実感いただけたかたと思います。

読み込んだデータは (rows, cols, bands)の3次元配列として扱えるので、波長ごとの情報やピクセル単位のスペクトルを簡単に取得できます。
次回は、この読み込んだスペクトルデータを実際に可視化する方法について、特定バンド画像の表示やスペクトルプロットの作成手順を紹介します。

ハイパースペクトルカメラコース

ご質問・ご相談お気軽にお問い合せください

お電話でのお問合せ 03-3258-1238 受付時間 平日9:00-18:00(土日祝日除く)
Webでのお問い合わせ