3장. 디지털 영상과 색공간 변환
빛의 삼원색과 RGB
캄캄한 무대에 빨강, 초록, 파랑 조명 세 개를 비춘다고 해 봅시다. 빨강과 초록 조명이 겹친 곳은 노랗게, 세 조명이 모두 겹친 곳은 하얗게 빛납니다. 조명을 더할수록 밝아집니다. 컴퓨터 화면의 점 하나하나가 이 세 조명이고, RGB 는 세 조명을 얼마나 세게 켰는지 적은 숫자입니다.
검은 바탕에 세 빛의 원을 겹쳤습니다. 두 빛이 겹친 곳은 노랑(빨강+초록), 자홍(빨강+파랑), 청록(초록+파랑)이 되고, 가운데 세 빛이 모두 겹친 곳은 흰색입니다. 여기서 무대 조명 하나가 채널 하나이고, 조명의 세기가 0~255 의 숫자입니다. 물감은 반대입니다. 물감은 섞을수록 빛을 더 많이 빨아들여 어두워집니다.
색 숫자 표
| 색 | R | G | B | 어떻게 섞였나 |
|---|---|---|---|---|
| 검정 | 0 | 0 | 0 | 모든 조명을 껐다 |
| 빨강 | 255 | 0 | 0 | 빨강 조명만 가득 |
| 초록 | 0 | 255 | 0 | 초록 조명만 가득 |
| 파랑 | 0 | 0 | 255 | 파랑 조명만 가득 |
| 노랑 | 255 | 255 | 0 | 빨강 + 초록 |
| 자홍 | 255 | 0 | 255 | 빨강 + 파랑 |
| 청록 | 0 | 255 | 255 | 초록 + 파랑 |
| 흰색 | 255 | 255 | 255 | 세 조명을 모두 가득 |
| 회색 | 128 | 128 | 128 | 세 조명을 같은 세기로 반쯤 |
세 숫자가 모두 같으면 색이 없는 회색이 됩니다. 숫자가 클수록 밝은 회색, 작을수록 어두운 회색입니다.
import numpy as np
# 빛 두 개를 겹치는 것은 숫자를 더하는 것과 같다. 255 를 넘지 않게 np.clip 으로 자른다
red = np.array([255, 0, 0]) # R, G, B 순서
green = np.array([0, 255, 0])
yellow = np.clip(red + green, 0, 255)
print(yellow) # 결과: [255 255 0] → 노랑
# 세 숫자가 같으면 회색이다
gray = np.array([128, 128, 128])
print(len(set(gray.tolist())) == 1) # 결과: True주의할 점
- 학교에서 배운 "물감의 삼원색"(자홍, 노랑, 청록)과 헷갈리지 않습니다. 화면과 카메라는 빛의 삼원색으로 색을 만듭니다.
- 같은 RGB 숫자라도 모니터마다 조금 다르게 보일 수 있습니다. 색을 정확히 견줄 때는 눈보다 숫자를 믿습니다.