画像処理に特化したscikit-imageのライブラリについて紹介します。

scikit-image

scikit-image は画像処理に特化した Python 画像ライブラリです。
NumPy 配列を画像オブジェクトをネイティブに扱います。 scikit-image を多様な画像処理タスクにどう利用するかや NumPy や Scipy などの他の Python の科学技術モジュールとの連携についても扱います。

Numpyのデータを作成し表示

20 X 20 のマトリックスを作成して、市松模様を描いています。
グレースケール(白と黒)のデータを考えます。
各行で白(1)と黒(0)のデータを交互に指定します。
numpyのスライシングを使って上手く作ってあげましょう。

import numpy as np
import matplotlib.pyplot as plt
data = np.zeros((20,20))
data[::2,1::2] = 1
data[1::2,::2] = 1
plt.imshow(data,cmap='gray')

画像の読み込み

サンプル画像データがあるので、それを読み込み関数があります。

サンプル画像は、猫の画像や、馬などの動物や、書類、コイン、月面、などが用意されています。
詳細はAPIドキュメントを参照してください。

from skimage import data
camera = data.camera()
plt.imshow(data.camera())
png

猫のchelesa

from skimage import data
d = data.chelsea()
plt.imshow(d)
png

画像処理のサンプル

上から200ピクセル分を黒が塗りつぶしています。

from skimage import data
camera = data.camera()
plt.imshow(data.camera())

camera[:200] = 0
plt.imshow(camera,cmap='gray')
png

次はマスクです。値が87未満(黒っぽい)部分を白(255)でマスクしてみます。
カメラマンの部分が白く浮かびかがってきます。

camera = data.camera()
mask = camera < 87
camera[mask] = 255
plt.imshow(camera,cmap='gray')
png

円で切り取ってみます。numpyを使って円の外側に部分を
黒でマスクしています。

camera = data.camera()
nrows, ncols = camera.shape
row, col = np.ogrid[:nrows, :ncols]

cnt_row, cnt_col = nrows / 2, ncols / 2
outer_disk_mask = ((row - cnt_row)**2 + (col - cnt_col)**2 > (nrows / 2)**2)
camera[outer_disk_mask] = 0

plt.imshow(camera,cmap='gray')
png

下半分の半円で切り取ってみます。numpyを使って円の外側に部分を
黒でマスクしています。

camera = data.camera()
nrows, ncols = camera.shape
row, col = np.ogrid[:nrows, :ncols]
cnt_row, cnt_col = nrows / 2, ncols / 2
lower_half = row > cnt_row
lower_half_disk = np.logical_and(lower_half, outer_disk_mask)
camera[lower_half_disk] = 0
plt.imshow(camera,cmap='gray')
png

縦横のサイズが異なる画像は、円ではなく楕円になります。
こちらもnumpyを使って楕円の外側に部分を
黒でマスクしています。

%matplotlib inline
from scipy import misc
import matplotlib.pyplot as plt
a = data.chelsea()

nrows,ncols ,_= a.shape
row, col = np.ogrid[:a.shape[0], :a.shape[1]]
cnt_row, cnt_col = nrows / 2, ncols / 2
x = (row - cnt_row)
y = (col - cnt_col)
outer_disk_mask = ( x**2/cnt_row**2 + y**2/cnt_col**2 > 1)
a[outer_disk_mask] = 0
plt.imshow(camera)

plt.imshow(a)
png

画像の2値化

画像の2値化を行う関数も用意されています。大津の手法(判別分析法)は、自動的に閾値を決定して二値化処理を行う手法の1つです。
skimageには大津の手法を行う関数が threshold_otsu 用意されています。

大津の手法については、以下を参考にしてください
大津の手法(ウィキペディア)

from skimage import data
from skimage import filters
image = data.camera()
thresh = filters.threshold_otsu(image)
binary = image <= thresh
plt.imshow(binary,cmap='gray')
png

以上です。

ライトハウスラボ