目次
概要
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 |
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

コメント