OpenCV 비전 실무4장 · 채널 처리와 히스토그램 분석3 / 21← 이전목차다음 →MetaContents

4장. 채널 처리와 히스토그램 분석

채널이란 다시 보기

문구점에서 파는 투명한 색 셀로판지를 떠올려 봅시다. 파랑, 초록, 빨강 셀로판지에 저마다 진하고 옅게 무늬를 그린 뒤 세 장을 겹쳐 빛에 비추면 여러 색이 섞인 그림이 보입니다. 컬러 그림이 바로 이렇게 생겼습니다. 1장에서 컬러 그림의 모양이 (세로, 가로, 3) 이라고 했는데, 마지막의 3 이 셀로판지 세 장입니다.

파랑, 초록, 빨강 셀로판지 세 장이 각각 0번, 1번, 2번 채널이라는 비교 그림

그림의 세 상자가 셀로판지 세 장입니다. 상자 테두리의 초록, 다홍, 보라는 순서를 나누는 색일 뿐 채널의 색과는 관계없습니다. 여기서 셀로판지 한 장이 채널 하나이고, 셀로판지에 칠한 진하기가 그 채널의 숫자(0~255)입니다. OpenCV 는 파랑을 0번, 초록을 1번, 빨강을 2번에 둡니다(BGR 순서).

노을 그림의 컬러 원본과 B, G, R 채널을 각각 흑백으로 띄운 네 그림

노을 그림을 채널 세 장으로 떼어 흑백으로 띄웠습니다. 셀로판지 한 장에는 숫자가 하나씩만 있으므로, 떼어 낸 채널은 흑백 그림 한 장입니다. 하늘이 붉은 노을이라 R 채널(맨 오른쪽)의 하늘이 가장 밝고, B 채널(둘째)의 하늘은 어둡습니다. 해는 R 과 G 채널에서 아주 밝고 B 채널에서는 덜 밝아서, 컬러로 보면 노랗습니다.

채널 세 장 견주기

채널 번호이름셀로판지흑백으로 띄웠을 때 밝은 곳
0B(Blue, 파랑)파랑 셀로판지파랑이 많은 곳(하늘, 물)
1G(Green, 초록)초록 셀로판지초록이 많은 곳(풀, 나무)
2R(Red, 빨강)빨강 셀로판지빨강이 많은 곳(노을, 사과)

짧은 예시

Python
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)은 채널 칸이 없는 (세로, 가로) 모양이라 나눌 채널이 없습니다.
← 이전 절4장 · 용어 짚고 가기다음 절 →4장 · 채널 나누기와 합치기