logo

색 공간

실습 준비

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는 색의 종류와 밝기를 분리하므로 색상 기반 처리에 편리.

RGB와 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)

BGR 채널을 각각 밝기로 표현한 이미지

B 채널만 남긴 컬러 이미지를 나머지 채널을 0으로 채워 결합하면 파란색 성분만 시각화.

zero = np.zeros_like(b)
blue_only = cv.merge((b, zero, zero))
to_pil(blue_only)

BGR 채널을 각각의 색으로 표현한 이미지

HSV 채널도 같은 방법으로 분리 가능. H 채널을 그레이스케일로 표시한 값은 밝기가 아니라 색상환 위의 위치.

h, s, v = cv.split(hsv)
Image.fromarray(h)
Previous
OpenCV 동영상과 웹캠