OpenCV 강좌, HSV 및 YUV 색상 공간

OpenCV는 컴퓨터 비전과 이미지 처리에 필요한 다양한 기능을 제공하는 오픈 소스 라이브러리입니다. 이 강좌에서는 OpenCV에서 사용되는 다양한 색상 공간 중 HSV(Hue, Saturation, Value)와 YUV 색상 공간에 대해 깊이 있게 다루겠습니다. 색상 공간은 이미지의 색상을 정의하는 방법으로, 이미지 처리 및 분석에서 중요한 역할을 합니다.

색상 공간이란?

색상 공간은 색상의 조합을 표현하는 체계입니다. 일반적으로 RGB(red, green, blue) 색상 공간이 많이 사용되지만, 특정 작업(예: 색상 기반 필터링)에서는 HSV와 YUV와 같은 다른 색상 공간이 더 유용할 수 있습니다. 색상 공간을 변경함으로써 특정 색상 범위를 더 쉽게 추출할 수 있습니다.

HSV 색상 공간

HSV 색상 공간은 색상을 다음 세 가지 성분으로 나누어 설명합니다:

  • Hue (H): 색상의 종류를 나타내며, 0°부터 360°까지의 각도로 표현됩니다. 빨강, 초록, 파랑 등의 색상이 각각 특정 각도로 매핑됩니다.
  • Saturation (S): 색상의 선명도를 나타내며, 0%에서 100%까지의 비율로 표현됩니다. 0%는 회색 (무채색), 100%는 선명한 색을 의미합니다.
  • Value (V): 색상의 밝기를 나타내며, 0에서 255까지의 값을 가집니다. 0은 완전히 어두운 색, 255는 완전히 밝은 색을 의미합니다.

HSV 색상 공간은 RGB 색상 공간보다 색상 선택과 조정이 용이하고 시각적으로 직관적입니다.

HSV 변환 예제

OpenCV를 사용하여 이미지를 HSV 색상 공간으로 변환하는 방법을 살펴보겠습니다. 아래의 예제 코드는 이미지를 읽고, RGB에서 HSV로 변환한 후 결과를 표시합니다.


import cv2
import numpy as np

# 이미지 읽기
image = cv2.imread('image.jpg')

# BGR에서 HSV로 변환
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 원본 이미지와 HSV 이미지 표시
cv2.imshow('Original Image', image)
cv2.imshow('HSV Image', hsv_image)

cv2.waitKey(0)
cv2.destroyAllWindows()
  

YUV 색상 공간

YUV 색상 공간은 TV 전송, 압축 및 신호 처리를 위해 설계된 색상 공간으로, 다음 세 가지 요소로 구성됩니다:

  • Y: 밝기 성분(루미넌스)으로, 이미지의 밝기를 나타냅니다.
  • U: 색상 성분 중 하나로, 색상의 푸른색 성분을 나타냅니다.
  • V: 색상 성분 중 다른 하나로, 색상의 빨간색 성분을 나타냅니다.

YUV 색상 공간은 압축률과 전송 품질을 높이기 위해 설계된 것이기 때문에 영상 신호 처리에서 널리 사용됩니다.

YUV 변환 예제

다음은 OpenCV를 사용하여 이미지를 YUV 색상 공간으로 변환하는 방법입니다. 아래 코드는 이미지를 읽고 BGR에서 YUV로 변환한 후 결과를 표시합니다.


# BGR에서 YUV로 변환
yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)

# 원본 이미지와 YUV 이미지 표시
cv2.imshow('Original Image', image)
cv2.imshow('YUV Image', yuv_image)

cv2.waitKey(0)
cv2.destroyAllWindows()
  

HSV 및 YUV 색상 공간의 활용

HSV와 YUV 색상 공간은 색상 기반의 객체 인식 및 추적을 수행하는 데 매우 유용합니다. 예를 들어 특정 색상의 물체를 추적하고 싶다면 다음과 같은 작업을 수행할 수 있습니다:

  • 특정 색상의 범위를 정의하여 이미지에서 필터링
  • 색상의 분포를 분석하여 객체의 위치 및 크기 파악
  • 비디오 스트리밍 중 실시간 객체 추적

색상 필터링 예제

아래 예제에서는 특정 색상(예: 빨간색) 범위 내의 픽셀을 추출하는 방법을 보여줍니다. 이 예제를 통해 HSV 색상 공간을 사용하여 특정 색상의 물체를 필터링하는 방법을 배울 수 있습니다.


# 색상 범위 정의 (예: 빨간색)
lower_red = np.array([0, 100, 100])
upper_red = np.array([10, 255, 255])

# 마스크 생성
mask = cv2.inRange(hsv_image, lower_red, upper_red)

# 마스크 적용
result = cv2.bitwise_and(image, image, mask=mask)

# 결과 표시
cv2.imshow('Mask', mask)
cv2.imshow('Filtered Red', result)

cv2.waitKey(0)
cv2.destroyAllWindows()
  

결론

이 글에서는 OpenCV를 활용한 HSV 및 YUV 색상 공간에 대해 다루었습니다. 색상 공간을 변경함으로써 이미지 처리에서의 색상 기반 작업이 얼마나 간편해지는지를 살펴보았습니다. HSV와 YUV 색상 공간은 색상 표현과 필터링을 용이하게 하여 다양한 컴퓨터 비전 프로젝트에서 널리 활용됩니다. 이 강좌를 통해 색상 공간의 기본 개념과 OpenCV 실습을 결합하여 이해도를 높일 수 있기를 바랍니다.

참고 문헌