OpenCV 비전 실무3장 · 디지털 영상과 색공간 변환7 / 21← 이전목차다음 →MetaContents

3장. 디지털 영상과 색공간 변환

RGB 와 BGR

날짜를 적는 법은 나라마다 다릅니다. 우리는 "2026-11-02"처럼 연, 월, 일 순서로 쓰지만, 일, 월, 연 순서로 쓰는 나라도 있습니다. 같은 날인데 순서만 다르니, 서로 주고받을 때 순서를 맞춰야 헷갈리지 않습니다. RGB 와 BGR 도 같은 색을 순서만 달리 적은 것입니다.

같은 빨강을 RGB 는 206, 37, 34 로, BGR 은 34, 37, 206 으로 적는다는 비교 그림

왼쪽은 보통의 RGB 순서, 오른쪽은 OpenCV 의 BGR 순서입니다. 바구니의 사과 한 칸을 RGB 로 적으면 [206, 37, 34], BGR 로 적으면 [34, 37, 206] 입니다. 여기서 날짜가 색이고, 연·월·일의 순서가 채널의 순서입니다.

왜 OpenCV 는 BGR 일까

OpenCV 를 처음 만들던 무렵, 여러 카메라 장치와 소프트웨어가 색을 B, G, R 순서로 저장하는 일이 많아 그 관례를 따랐다고 알려져 있습니다. 지금은 RGB 를 쓰는 라이브러리가 더 많지만, OpenCV 는 예전 코드와 맞추려고 BGR 을 그대로 씁니다. 그래서 OpenCV 와 다른 라이브러리 사이를 오갈 때마다 순서를 바꿔 줍니다.

순서를 바꾸는 두 가지 방법

방법코드특징
cvtColorcv2.cvtColor(img, cv2.COLOR_BGR2RGB)새 배열을 만든다. 이름만 봐도 뜻이 분명하다
배열 뒤집기img[..., ::-1]채널 칸을 거꾸로 읽는다. 새 배열을 만들지 않아 빠르다

[..., ::-1] 에서 ... 은 "앞의 방향(세로, 가로)은 모두", ::-1 은 "마지막 방향(채널)을 끝에서부터 거꾸로"라는 뜻입니다. [B, G, R] 이 [R, G, B] 가 됩니다.

Python
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 로 바꾼 그림을 그대로 저장하면 빨강과 파랑이 바뀐 파일이 됩니다.
← 이전 절3장 · 빛의 삼원색과 RGB다음 절 →3장 · Gray 변환