색 공간
실습 준비
import cv2 as cv
import numpy as np
from PIL import Image
from yeom import to_pil
image = cv.imread("balloon.webp")
색 공간
색 공간(color space)은 색을 수치로 표현하는 규칙. 같은 픽셀도 목적에 따라 서로 다른 색 공간으로 표현 가능.
| 색 공간 | 채널 | 주요 용도 |
|---|---|---|
| BGR | 파랑·초록·빨강 | OpenCV의 기본 컬러 배열 |
| 그레이스케일(Gray) | 밝기 | 문서 처리, 명암 분석, 이진화 |
| HSV | 색상·채도·명도 | 색 범위 선택, 밝기 보정 |
- HSV는 색의 종류와 밝기를 분리하므로 색상 기반 처리에 편리.

색 공간 변환
cv.cvtColor()에는 원본과 변환 규칙을 전달.
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
Image.fromarray(gray)
그레이스케일 이미지는 (세로, 가로) 형태의 1채널 배열.
gray.shape
실행 결과
(1024, 1024)
컬러 이미지에서 채널 축이 사라져 2차원 배열이 됨.
BGR을 HSV로 변환하면 색상(Hue), 채도(Saturation), 명도(Value)를 각각 다룰 수 있음.
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
hsv.shape
실행 결과
(1024, 1024, 3)
채널의 의미는 달라지지만 세 채널 구조는 유지됨.
8비트 OpenCV 이미지에서 HSV 채널의 범위는 다음과 같음.
| 채널 | 의미 | 범위 |
|---|---|---|
| H | 색상환 위의 위치 | 0–179 |
| S | 색의 선명한 정도 | 0–255 |
| V | 밝기 | 0–255 |
색상 H의 원래 범위는 0도 이상 360도 미만. OpenCV의 기본 8비트 HSV에서는 색상 각도를 2도 단위로 저장하므로 H 값의 범위는 0–179.
채널 분리와 결합
cv.split()은 채널을 각각의 2차원 배열로 분리하고 cv.merge()는 다시 결합.
b, g, r = cv.split(image)
b.shape, g.shape, r.shape
실행 결과
((1024, 1024), (1024, 1024), (1024, 1024))
각 채널은 원본의 세로·가로 크기를 유지하는 2차원 배열.
채널 하나만 그레이스케일로 표시하면 해당 색 성분의 강도를 확인할 수 있음.
Image.fromarray(b)

B 채널만 남긴 컬러 이미지를 나머지 채널을 0으로 채워 결합하면 파란색 성분만 시각화.
zero = np.zeros_like(b)
blue_only = cv.merge((b, zero, zero))
to_pil(blue_only)

HSV 채널도 같은 방법으로 분리 가능. H 채널을 그레이스케일로 표시한 값은 밝기가 아니라 색상환 위의 위치.
h, s, v = cv.split(hsv)
Image.fromarray(h)
퀴즈
OpenCV의 BGR 이미지 image를 그레이스케일로 변환하는 코드는?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.