Python NumPyで画像処理

Pillow(PIL)で読み込んだ画像をNumPyの配列ndarrayとして格納し、画素値を操作できる。

方法

np.array()PIL.Imageを渡すとndarrayが得られる。RGB画像は行 x 列 x 色の三次元のndarray、白黒画像は行 x 列の二次元のndarrayになる。

値の取得や書き換え、スライス操作や結合などndarrayの操作がそのままできる。

Image.fromarray()ndarrayを渡すと逆にPIL.Imageが得られる。save()で画像として保存するなどの操作が可能になる。

単色化

他の色の値を0にして単色画像を生成する。さらに横に並べて結合する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from PIL import Image
import numpy as np
im = np.array(Image.open('lena.jpg'))
print(im.ndim, im.shape) # 次元数、サイズ
# => 3 (512, 512, 3)
print(im[256, 256]) # 指定した座標の色(原点は左上)
# => [181 66 73]
print(im[:, :, 0].min()) # Redの最小値
# => 50
im_R = im.copy()
im_R[:, :, (1, 2)] = 0
im_G = im.copy()
im_G[:, :, (0, 2)] = 0
im_B = im.copy()
im_B[:, :, (0, 1)] = 0
# 横に並べて結合(どれでもよい)
im_RGB = np.concatenate((im_R, im_G, im_B), axis=1)
# im_RGB = np.hstack((im_R, im_G, im_B))
# im_RGB = np.c_['1', im_R, im_G, im_B]
pil_img = Image.fromarray(im_RGB)
pil_img.save('lena_RGBs.jpg')

RGBs

ガンマ補正

画素の値を計算するのも簡単。掛け算、割り算、累乗、なんでもできる。

1
2
3
4
5
6
7
8
9
10
11
12
from PIL import Image
import numpy as np
im = np.array(Image.open('lena.jpg'), 'f') # floatで読み込み
im_1_22 = 255.0 * (im/255.0)**(1/2.2)
im_22 = 255.0 * (im/255.0)**2.2
im_gamma = np.concatenate((im_1_22, im, im_22), axis=1)
pil_img = Image.fromarray(np.uint8(im_gamma)) # floatをuintに変換
pil_img.save('lena_gammas.jpg')

gammas

スポンサーリンク

関連記事