scikit-imageでの画像データの扱い

Pythonでの機械学習ライブラリとしては有名な scikit-learn があるが,
画像処理ライブラリは scikit-image がある.

最近Pythonでの画像処理の勉強をしていて気になったので,
scikit-image での画像の型の扱いについてメモ.

scikit-image ライブラリでは,画像の読み込みは,サブモジュールの skimage.data を使い,

import skimage.data

img = skimage.data.imread("lenna.jpg")

のように書く.

この時,読み込まれた画像は,uint8の型のarrayになっていて,
値は 0〜255 の間の整数値となる.

例えばグレースケール化したいと思った時,skimage.color.rgb2gray という関数を使うが,
これを行なうと,

import skimage.color
gimg = skimage.color.rgb2gray(img)

結果の gimg は,float64 型になっていて,
値は 0.0〜1.0 の浮動小数点型となる.

画像処理においては, 0.0〜1.0 の間の浮動小数点数として扱うのが,
メモリは食うけど便利.

この辺りの型の変換を行なうのが,

skimage.img_as_bool(img)
skimage.img_as_ubyte(img)
skimage.img_as_int(img)
skimage.img_as_uint(img)
skimage.img_as_float(img)

の関数.

それぞれ,
skimage.img_as_bool(img):
bool型 (True / False の2値)

skimage.img_as_ubyte(img):
uint8型(読み込んだ時の状態.[0,255]の範囲)

skimage.img_as_int(img):
int16型(uint8の[0,255]が[0,32767]にマップされる.負の値も格納可.)

skimage.img_as_uint(img):
uint16型([0,65535]の範囲)

skimage.img_as_float(img):
float64型(uint8の[0,255]が[0.0,1.0]にマップされる.負の値も格納可.)

となる.
なお,この範囲は, skimage.dtype_limits(img) によってタプルで取得可能.