4장. 채널 처리와 히스토그램 분석
채널이란 다시 보기
문구점에서 파는 투명한 색 셀로판지를 떠올려 봅시다. 파랑, 초록, 빨강 셀로판지에 저마다 진하고 옅게 무늬를 그린 뒤 세 장을 겹쳐 빛에 비추면 여러 색이 섞인 그림이 보입니다. 컬러 그림이 바로 이렇게 생겼습니다. 1장에서 컬러 그림의 모양이 (세로, 가로, 3) 이라고 했는데, 마지막의 3 이 셀로판지 세 장입니다.
그림의 세 상자가 셀로판지 세 장입니다. 상자 테두리의 초록, 다홍, 보라는 순서를 나누는 색일 뿐 채널의 색과는 관계없습니다. 여기서 셀로판지 한 장이 채널 하나이고, 셀로판지에 칠한 진하기가 그 채널의 숫자(0~255)입니다. OpenCV 는 파랑을 0번, 초록을 1번, 빨강을 2번에 둡니다(BGR 순서).
노을 그림을 채널 세 장으로 떼어 흑백으로 띄웠습니다. 셀로판지 한 장에는 숫자가 하나씩만 있으므로, 떼어 낸 채널은 흑백 그림 한 장입니다. 하늘이 붉은 노을이라 R 채널(맨 오른쪽)의 하늘이 가장 밝고, B 채널(둘째)의 하늘은 어둡습니다. 해는 R 과 G 채널에서 아주 밝고 B 채널에서는 덜 밝아서, 컬러로 보면 노랗습니다.
채널 세 장 견주기
| 채널 번호 | 이름 | 셀로판지 | 흑백으로 띄웠을 때 밝은 곳 |
|---|---|---|---|
| 0 | B(Blue, 파랑) | 파랑 셀로판지 | 파랑이 많은 곳(하늘, 물) |
| 1 | G(Green, 초록) | 초록 셀로판지 | 초록이 많은 곳(풀, 나무) |
| 2 | R(Red, 빨강) | 빨강 셀로판지 | 빨강이 많은 곳(노을, 사과) |
짧은 예시
import cv2
# 노을 그림을 읽는다. 컬러 그림은 (세로, 가로, 3) 모양이다
img = cv2.imread("ch04_scenes/sunset.png")
print(img.shape) # 결과: (240, 320, 3)
# 해 한가운데(세로 140, 가로 200)의 숫자 세 개: B, G, R 순서
print(img[140, 200]) # 결과: [120 220 255]
# 2번 채널(빨강)만 꺼내면 숫자가 하나씩인 흑백 그림이 된다
print(img[:, :, 2].shape) # 결과: (240, 320)해 한가운데의 숫자는 파랑 120, 초록 220, 빨강 255 입니다. 빨강과 초록이 가득하고 파랑이 덜하니 노란빛이 됩니다. 1장에서 본 빛의 색 섞기 그대로입니다.
주의할 점
- 채널 번호는 0 부터 셉니다. "빨강은 세 번째"라고 생각해
img[:, :, 3]을 쓰면 범위를 벗어났다는 오류가 납니다. - 흑백으로 읽은 그림(2장의
IMREAD_GRAYSCALE)은 채널 칸이 없는 (세로, 가로) 모양이라 나눌 채널이 없습니다.