NumPyでRGB画像の色チャンネルを分離して単色化、白黒化、色交換

Python, NumPyを使った画像処理において、RGB画像は行(高さ) x 列(幅) x 色(3)の三次元の配列ndarray、白黒画像は行(高さ) x 列(幅)の二次元の配列ndarrayになる。 ただの配列なのでそれぞれの色チャンネルに対する処理も簡単。

単色化 白黒化(グレースケール化) 色交換(色の入れ替え)

について説明します。 画像ファイルの読み込みや保存については以下の記事を参照。

単色化

他の色の値を0にして単色画像を生成します。さらに横に並べて結合します。 結合についての詳細は以下の記事参照。

from PIL import Image
import numpy as np

im = np.array(Image.open('data/src/lena_square.png'))

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_RGB = Image.fromarray(im_RGB)
pil_img_RGB.save('data/dst/lena_numpy_split_color.jpg')

白黒化(グレースケール化)

ここでは輝度信号Yを計算して白黒画像(グレースケール画像)を生成します。Yの計算式については以下のページ参照。

YUV - Wikipedia

im_gray = 0.299 * im[:, :, 0] + 0.587 * im[:, :, 1] + 0.114 * im[:, :, 2]

print(im.dtype)
print(im_gray.dtype)
# uint8
# float64

print(im.shape)
print(im_gray.shape)
# (512, 512, 3)
# (512, 512)

pil_img_gray = Image.fromarray(np.uint8(im_gray))
pil_img_gray.save('data/dst/lena_numpy_gray.jpg')

小数点を使った計算によって型dtypeがfloatになるので、保存時はuint8に変換します。 RGB画像(行(高さ) x 列(幅) x 色(3)の三次元の配列ndarray)から白黒画像(行(高さ) x 列(幅)の二次元の配列ndarray)を算出しているが、Pillowを使って保存saveすると、特に指定しなくても白黒画像として保存してくれる。

色交換(入れ替え)

RとBを入れ替える。

im_swap = im.copy()
im_swap[:, :, 0], im_swap[:, :, 2] = im[:, :, 2], im[:, :, 0]

pil_img_swap = Image.fromarray(im_swap)
pil_img_swap.save('data/dst/lena_numpy_swap_color.jpg')

シェア

関連カテゴリー

Python NumPy 画像処理

Python, OpenCV, Pillow(PIL)で画像サイズ(幅、高さ)を取得 NumPy配列ndarrayをタイル状に繰り返し並べるnp.tile Python, NumPy(OpenCV)で画像を二値化処理 Python, NumPyで画像処理(読み込み、演算、保存) Python, NumPyでグラデーション画像を生成 Pythonでの画像処理、Pillow, NumPy, OpenCVの違いと使い分け Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理 NumPy配列ndarrayをシフト(スクロール)させるnp.roll Python, Pillowで画像に別の画像を貼り付けるpaste NumPyのsortとargsort関数で任意の行・列を基準にソート Python, Pillowで円や四角、直線などの図形を描画 Python, NumPyで行列の演算(逆行列、行列式、固有値など) Python, Pillowで画像を回転するrotate Python, Pillow, qrcodeでQRコード画像を生成、保存 Python, OpenCVで幾何変換(アフィン変換・射影変換など)

Last Updated: 6/26/2019, 10:34:03 PM