4장. 채널 처리와 히스토그램 분석
채널 바꿔치기와 색 정보 분석
옷장 서랍에 붙은 이름표를 바꿔 달면, 양말 서랍에서 셔츠가 나옵니다. 채널도 cv2.merge 에 넣는 순서를 바꾸면 빨강 자리에 파랑 숫자가 들어가 색이 바뀝니다. 그리고 서랍마다 옷이 몇 벌 들었는지 세어 보면 그 집 사람이 어떤 옷을 많이 입는지 알 수 있듯, 채널마다 평균을 내면 사진이 어느 색으로 쏠렸는지 알 수 있습니다.
그림의 세 상자는 이 절에서 하는 세 가지 일입니다. 첫째 상자가 이름표 바꿔 달기, 둘째와 셋째 상자가 서랍 속 옷 세기에 해당합니다. 여기서 서랍이 채널이고, 옷의 양이 채널 평균입니다.
채널 평균으로 읽는 색 경향
| 채널 평균의 모습 | 읽는 법 | 흔한 장면 |
|---|---|---|
| R 이 B 보다 뚜렷이 크다 | 따뜻한 쪽(붉은빛, 누런빛) | 노을, 백열등 아래의 실내 |
| B 가 R 보다 뚜렷이 크다 | 차가운 쪽(푸른빛) | 하늘, 물, 그늘 |
| G 가 가장 크다 | 초록이 많다 | 숲, 풀밭 |
| 세 값이 비슷하다 | 쏠림이 적다 | 회색 건물, 흐린 날 |
"뚜렷이"의 기준은 쓰는 사람이 정합니다. 이 장의 실습은 R 과 B 의 차이가 30 을 넘으면 쏠렸다고 봅니다. 3장에서 본 HSV 의 색상(H)으로도 색을 읽을 수 있지만, 이 장은 B·G·R 평균만으로 간단히 읽습니다.
짧은 예시
import cv2
import numpy as np
img = cv2.imread("ch04_scenes/sunset.png")
b, g, r = cv2.split(img)
# 넣는 순서를 [r, g, b] 로 바꾸면 빨강 숫자가 파랑 자리로 간다
swapped = cv2.merge([r, g, b])
print(img[140, 200], "→", swapped[140, 200]) # 결과: [120 220 255] → [255 220 120]
# cv2.mean: 채널마다의 평균을 네 칸짜리 튜플로 돌려준다(넷째 칸은 투명도 자리라 0)
means = cv2.mean(img)
print([round(v, 1) for v in means[:3]]) # 결과: B, G, R 평균 세 개
# NumPy 로도 같다: 세로·가로 방향(axis 0, 1)으로 평균을 내고 채널만 남긴다
print([round(float(v), 1) for v in img.mean(axis=(0, 1))])노을 그림의 평균은 B 61.1, G 86.6, R 185.5 입니다. R 이 B 보다 120 넘게 크니 따뜻한 쪽으로 크게 쏠린 사진입니다. axis 는 "축"이라는 뜻으로, 평균을 낼 방향을 고릅니다.
주의할 점
cv2.mean은 채널이 셋이어도 네 칸짜리 값을 돌려줍니다. 앞의 세 칸만 씁니다.- 평균은 사진 전체를 한 숫자로 뭉뚱그립니다. 붉은 해 하나가 작게 있어도 평균은 거의 바뀌지 않습니다. 일부만 보고 싶으면 뒤에서 볼 마스크를 씁니다.