HSV の場合、チャンネル数は3なので (高さ, 幅, 3) の3次元配列で表されます。
python
1h = hsv[:, :, 0]
2s = hsv[:, :, 1]
3v = hsv[:, :, 2]
このコードは3次元配列を numpy の Indexing 機能を利用して、チャンネルごとに分割しています。
列数と行数はなぜなにも入っていないのか
:
はその axis
方向の全範囲を表します。
hsv[:, :, 0]
の場合、高さ及び幅は全範囲を指定しています。
簡単な例
python
1import numpy as np
2
3a = np.array(
4 [
5 [[0, 1, 2],
6 [0, 1, 2],
7 [0, 1, 2]],
8
9 [[0, 1, 2],
10 [0, 1, 2],
11 [0, 1, 2]],
12
13 [[0, 1, 2],
14 [0, 1, 2],
15 [0, 1, 2]],
16 ]
17)
18
19print(a[:, :, 0])
20# [[0 0 0]
21# [0 0 0]
22# [0 0 0]]
23
24print(a[:, :, 1])
25# [[1 1 1]
26# [1 1 1]
27# [1 1 1]]
28
29print(a[:, :, 2])
30# [[2 2 2]
31# [2 2 2]
32# [2 2 2]]
補足
チャンネルの分割は cv2.split
を使ったほうがわかりやすいコードになると思います。
画像上の基本的な処理 — OpenCV-Python Tutorials 1 documentation
python
1import cv2
2import numpy as np
3
4a = np.array(
5 [
6 [[0, 1, 2],
7 [0, 1, 2],
8 [0, 1, 2]],
9
10 [[0, 1, 2],
11 [0, 1, 2],
12 [0, 1, 2]],
13
14 [[0, 1, 2],
15 [0, 1, 2],
16 [0, 1, 2]],
17 ]
18)
19
20h, s, v = cv2.split(a)
質問の内容は numpy のインデックス操作の話なので、より詳しくは以下を参照ください。