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)

퀴즈

문제 1 / 5맞음: 0힌트: 0틀림: 0채점중: 0남음: 5

OpenCV의 BGR 이미지 image를 그레이스케일로 변환하는 코드는?

  • cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  • cv.cvtColor(cv.COLOR_BGR2GRAY, image)
  • cv.COLOR_BGR2GRAY(image)
  • cv.cvtColor(image, cv.COLOR_GRAY2BGR)

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
OpenCV 동영상과 웹캠