OpenCV – チャンネルを分離または結合する方法

目次

概要

OpenCV の Python 版では画像は ndarray で表されます。 画像の切り抜きやチャンネルの分離、画像の一部にのみ他の値を代入するといったことは numpy の機能で実現できます。

画像の形式

OpenCV の Python 版では、画像は numpy.uint8 型の NumPy 配列で表されます。

dtype shape ndims
グレースケール numpy.uint8 (Height, Width) 2
カラー画像 numpy.uint8 (Height, Width, 3) 3
アルファチャンネル付きカラー画像 numpy.uint8 (Height, Width, 4) 3

ndarray による画像の表現

NumPy 配列の軸 (axis) は、以下のように対応します。

axis 内容
0 高さ
1
2 チャンネル

チャンネルを分割する

チャンネル方向は axis=2 となっているため、axis=2 でスライスすることで各チャンネルを分離できます。 例えば、青のチャンネルを取り出すには img[:, :, 0] または img[..., 0] と記述します。

In [1]:
import cv2
import numpy as np
from IPython.display import Image, display


def imshow(img):
    """ndarray 配列をインラインで Notebook 上に表示する。"""
    ret, encoded = cv2.imencode(".jpg", img)
    display(Image(encoded))
In [2]:
img = cv2.imread("sample.jpg")

b = img[..., 0]
g = img[..., 1]
r = img[..., 2]
imshow(b)
imshow(g)
imshow(r)

または cv2.split() を使用しても分割できます。

In [3]:
b, g, r = cv2.split(img)

チャンネルを結合する

分割されたチャンネルは、numpy.dstack() または cv2.merge() を使用して結合し、カラー画像に戻せます。

In [4]:
img = cv2.merge((b, g, r))

# または
# img = np.dstack((b, g, r))
True

コメント

コメントする

目次