3장. 디지털 영상과 색공간 변환
RGB 와 BGR
날짜를 적는 법은 나라마다 다릅니다. 우리는 "2026-11-02"처럼 연, 월, 일 순서로 쓰지만, 일, 월, 연 순서로 쓰는 나라도 있습니다. 같은 날인데 순서만 다르니, 서로 주고받을 때 순서를 맞춰야 헷갈리지 않습니다. RGB 와 BGR 도 같은 색을 순서만 달리 적은 것입니다.
왼쪽은 보통의 RGB 순서, 오른쪽은 OpenCV 의 BGR 순서입니다. 바구니의 사과 한 칸을 RGB 로 적으면 [206, 37, 34], BGR 로 적으면 [34, 37, 206] 입니다. 여기서 날짜가 색이고, 연·월·일의 순서가 채널의 순서입니다.
왜 OpenCV 는 BGR 일까
OpenCV 를 처음 만들던 무렵, 여러 카메라 장치와 소프트웨어가 색을 B, G, R 순서로 저장하는 일이 많아 그 관례를 따랐다고 알려져 있습니다. 지금은 RGB 를 쓰는 라이브러리가 더 많지만, OpenCV 는 예전 코드와 맞추려고 BGR 을 그대로 씁니다. 그래서 OpenCV 와 다른 라이브러리 사이를 오갈 때마다 순서를 바꿔 줍니다.
순서를 바꾸는 두 가지 방법
| 방법 | 코드 | 특징 |
|---|---|---|
| cvtColor | cv2.cvtColor(img, cv2.COLOR_BGR2RGB) | 새 배열을 만든다. 이름만 봐도 뜻이 분명하다 |
| 배열 뒤집기 | img[..., ::-1] | 채널 칸을 거꾸로 읽는다. 새 배열을 만들지 않아 빠르다 |
[..., ::-1] 에서 ... 은 "앞의 방향(세로, 가로)은 모두", ::-1 은 "마지막 방향(채널)을 끝에서부터 거꾸로"라는 뜻입니다. [B, G, R] 이 [R, G, B] 가 됩니다.
import cv2
import numpy as np
# 사과 한 칸만 담은 1×1 컬러 그림(BGR)
px = np.array([[[34, 37, 206]]], dtype=np.uint8)
print(cv2.cvtColor(px, cv2.COLOR_BGR2RGB)[0, 0]) # 결과: [206 37 34]
print(px[..., ::-1][0, 0]) # 결과: [206 37 34]
# RGB → BGR 도 같은 방법이다(COLOR_RGB2BGR 또는 다시 뒤집기)
print(px[..., ::-1][..., ::-1][0, 0]) # 결과: [ 34 37 206] → 두 번 뒤집으면 제자리주의할 점
img[..., ::-1]로 만든 배열은 원본의 숫자를 거꾸로 읽기만 하는 "보기"입니다. 여기에cv2.circle같은 그리기 함수를 쓰면 "Layout of the output array img is incompatible" 오류가 납니다. 그릴 때는img[..., ::-1].copy()로 복사본을 만듭니다.- 저장할 때도 순서를 지킵니다.
cv2.imwrite는 BGR 을 기대하므로, RGB 로 바꾼 그림을 그대로 저장하면 빨강과 파랑이 바뀐 파일이 됩니다.