目次
概要
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)
![](/wp_pystyle/wp-content/uploads/2024/07/opencv-channel-manipulation_02.jpg)
![](/wp_pystyle/wp-content/uploads/2024/07/opencv-channel-manipulation_03.jpg)
![](/wp_pystyle/wp-content/uploads/2024/07/opencv-channel-manipulation_04.jpg)
または 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
コメント