3장. 디지털 영상과 색공간 변환
Gray 변환
입시에서 국어, 수학, 영어 점수를 그냥 평균 내지 않고 "수학 50%, 국어 30%, 영어 20%"처럼 반영 비율을 달리해 합치는 학교가 있습니다. 흑백 변환도 이렇게 합니다. R, G, B 를 똑같이 3분의 1씩 섞지 않고, 사람 눈이 밝게 느끼는 정도에 맞춰 초록에 가장 큰 무게를 줍니다.
그림의 네 단계가 흑백 변환의 전부입니다. 둘째 단계에서 R 에는 0.299, G 에는 0.587, B 에는 0.114 를 곱합니다. 세 무게를 더하면 0.299 + 0.587 + 0.114 = 1 이므로, 흰색(255, 255, 255)은 흑백에서도 255 가 됩니다. 여기서 과목 점수가 R, G, B 이고, 반영 비율이 무게이고, 합친 점수가 흑백 밝기입니다.
손으로 계산해 보기
식은 다음과 같습니다. 옛 텔레비전 방송 표준(ITU-R BT.601)에서 정한 값이고(ITU-R 은 국제전기통신연합의 전파통신 부문, International Telecommunication Union Radiocommunication Sector), OpenCV 의 COLOR_BGR2GRAY 도 이 식을 씁니다.
밝기 = 0.299 × R + 0.587 × G + 0.114 × B바구니의 왼쪽 사과 한 칸은 BGR 로 [34, 37, 206] 입니다. 곧 R = 206, G = 37, B = 34 입니다.
| 채널 | 값 | 무게 | 곱 |
|---|---|---|---|
| R | 206 | 0.299 | 61.594 |
| G | 37 | 0.587 | 21.719 |
| B | 34 | 0.114 | 3.876 |
| 합 | 87.189 → 반올림 87 |
cv2.cvtColor 로 바꾼 흑백 그림에서도 이 칸은 87 입니다. 실습 3에서 그림 전체로 견줘 봅니다.
단순 평균과 무엇이 다를까
세 숫자를 그냥 더해 3으로 나누는 단순 평균도 흑백을 만듭니다. 하지만 빨강, 초록, 파랑처럼 "숫자의 합"이 비슷한 색을 모두 같은 회색으로 만들어 버립니다.
가운데 가중 평균에서는 Green 칸이 Red, Blue 칸보다 밝고, Blue 칸이 가장 어둡습니다. 오른쪽 단순 평균에서는 Red, Green, Blue 칸이 거의 같은 회색입니다. 사람 눈에는 초록이 파랑보다 훨씬 밝아 보이므로 가운데가 눈에 더 가깝습니다.
| 색 견본 | B, G, R | 가중 평균(cvtColor) | 단순 평균 |
|---|---|---|---|
| Red | 40, 40, 220 | 94 | 100 |
| Green | 60, 170, 60 | 125 | 97 |
| Blue | 200, 80, 30 | 79 | 103 |
import numpy as np
# 사과 한 칸(BGR)의 세 숫자로 흑백 밝기를 손으로 계산한다
b, g, r = 34, 37, 206
weighted = 0.299 * r + 0.587 * g + 0.114 * b
simple = (r + g + b) / 3
print(round(weighted, 3), round(weighted)) # 결과: 87.189 87
print(round(simple, 3)) # 결과: 92.333 → 단순 평균은 조금 더 밝게 나온다주의할 점
- 흑백으로 바꾸면 색 정보가 사라집니다. 빨간 사과와 같은 밝기의 초록 라임은 흑백에서 구별되지 않을 수 있습니다. 색으로 가르려면 흑백이 아니라 다음 절의 HSV 를 씁니다.
- OpenCV 는 이 계산을 정수로 빠르게 하므로, NumPy 로 같은 식을 계산하면 몇몇 칸이 1 차이 날 수 있습니다.