SimpleITKのGetArrayFromImageとGetArrayViewFromImageの違い

公開日:
目次

SimpleITKのGetArrayFromImageGetArrayViewFromImage関数は、いずれもSimpleITKイメージをNumPy配列に変換するために使用されますが、その働き方は大きく異なります。この記事では、これら二つの関数の違いとそれぞれの用途について詳しく見ていきましょう。

GetArrayFromImage

コピーを作成

GetArrayFromImage関数は、SimpleITKイメージから新しいNumPy配列を作成します。これは、元のイメージデータに影響を与えないため、データの安全性が保たれます。

用途

この関数は、データの一部を変更したくない場合や、元のイメージの保護を必要とする場合に特に有用です。

import SimpleITK as sitk
import numpy as np

# SimpleITKイメージの作成
image = sitk.Image([10, 10], sitk.sitkUInt8)
image += np.random.randint(0, 255, size=(10, 10)).astype(np.uint8)

# 画像をコピーしてNumPy配列に変換
array = sitk.GetArrayFromImage(image)

# 配列を変更しても元の画像は影響を受けません
array[0, 0] = 255
print(array[0, 0])             # 255と表示されます
print(sitk.GetArrayFromImage(image)[0, 0])  # 元の値が表示されます (0以外)

GetArrayViewFromImage

ビューを返す

対照的に、GetArrayViewFromImage関数は、SimpleITKイメージのデータに対するビュー(参照)を返します。これにより、NumPy配列とSimpleITKイメージは同じデータ領域を共有することになります。

用途

メモリ効率を重視し、元のイメージデータに直接アクセスおよび変更を加える場合に適しています。

import SimpleITK as sitk
import numpy as np

# SimpleITKイメージの作成
image = sitk.Image([10, 10], sitk.sitkUInt8)
image += np.random.randint(0, 255, size=(10, 10)).astype(np.uint8)

# 画像のビューをNumPy配列として取得
array_view = sitk.GetArrayViewFromImage(image)

# 配列を変更すると元の画像にも影響します
array_view[0, 0] = 255
print(array_view[0, 0])         # 255と表示されます
print(sitk.GetArrayViewFromImage(image)[0, 0])  # 255と表示されます

比較

以下の表は、GetArrayFromImageGetArrayViewFromImageの特徴をまとめたものです。

特徴 GetArrayFromImage GetArrayViewFromImage
メモリ効率 一つの配列がメモリに作成される メモリ効率が良い、ビューを使用
元の画像への影響 なし ビューを通して元の画像データが変更される
用途 元のデータを保護しつつNumPy配列を使用したい場合 メモリ効率を重視し、直接データ操作を行いたい場合

このように、GetArrayFromImageは元のデータを保持したままNumPy配列を取得するのに対して、GetArrayViewFromImageはメモリ効率を重視してデータのビューを作成します。用途に応じて使い分けることで、より効率的なデータ処理が可能です。

ひとまずGetArrayFromImage()を利用して、用途に応じてGetArrayViewFromImage()に切り替えるのが、考え方として楽かもしれません。