1. HSV 색공간 개요
HSV는 Hue(색상), Saturation(채도), Value(명도)를 의미하며, 사람의 색 인지 방식과 유사하게 색상과 밝기를 분리해 다룰 수 있는 색공간이다. OpenCV에서는 Hue가 0~179, Saturation과 Value가 각각 0~255 범위를 갖는다[1]. Hue는 색상을 각도로 표현하며, 원형 상에서 0°(빨강) → 60°(노랑) → 120°(초록) → 180°(청록) → 240°(파랑) → 300°(자홍) → 360°(빨강)로 순환한다. OpenCV는 이 0~360°를 0~180로 나누어 사용한다.
2. BGR→HSV 변환 및 inRange 함수 활용
OpenCV에서는 cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
로 BGR 이미지를 HSV로 변환한 뒤, cv2.inRange()
를 이용해 특정 색상 범위 내의 픽셀을 이진 마스크로 추출한다[2].
import cv2
import numpy as np
img = cv2.imread('image.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([H_min, S_min, V_min])
upper = np.array([H_max, S_max, V_max])
mask = cv2.inRange(hsv, lower, upper)
이렇게 생성된 mask
는 흰색(255)이 범위 내 픽셀, 검은색(0)이 범위 외 픽셀을 나타낸다.
3. 빨강(Red) 색상의 범위 처리
빨강은 Hue가 원형의 양끝(0° 근처와 360° 근처)에 위치하므로 단일 범위로 처리할 수 없다. 이때 두 개의 범위로 나누어 마스크를 생성한 뒤 합산해야 한다.
# 낮은 영역
lower1 = np.array([0, 50, 70])
upper1 = np.array([9, 255, 255])
# 높은 영역
lower2 = np.array([159, 50, 70])
upper2 = np.array([180, 255, 255])
mask1 = cv2.inRange(hsv, lower1, upper1)
mask2 = cv2.inRange(hsv, lower2, upper2)
red_mask = cv2.bitwise_or(mask1, mask2)
4. 대표 색상별 HSV 범위
아래 표는 자주 쓰이는 색상들의 하한·상한 범위 예시이다[3]. 조명 조건에 따라 S·V 최소값은 조정이 필요하다.
색상 | 하한 [H,S,V] | 상한 [H,S,V] |
---|---|---|
Black | [3] | [3] |
White | [3] | [4][3] |
Red | [3] & [3] | [3][3] & [3] |
Green | [3] | [3] |
Blue | [3] | [3] |
Yellow | [3] | [3] |
Orange | [5][3] | [3] |
Purple | [3] | [3] |
Gray | [3] | [4][3] |
5. 마스크 후처리: 형태학적 연산
마스크 생성 후 노이즈 제거 및 구멍 메우기를 위해 형태학적 연산을 적용한다[6].
- 침식(Erosion): 작은 흰색 노이즈 제거
- 팽창(Dilation): 객체 크기 확장
- 열기(Opening): 침식→팽창으로 잡티 제거
- 닫기(Closing): 팽창→침식으로 객체 내부 구멍 메우기
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
opened = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
6. 실전 팁 및 주의사항
환경 조명 변화, 그림자, 반사 등에 따라 S·V 값이 크게 변동하므로, 추출하려는 대상의 샘플 이미지를 여러 각도에서 측정해 히스토그램으로 H·S·V 분포를 분석하고 범위를 정하는 것이 좋다. GIMP, Paint.NET 같은 도구로 픽셀 단위 HSV 값을 확인한 후, OpenCV 표준 범위로 변환할 때는 Hue÷2, Saturation·Value×2.55 공식을 활용한다. 이를 통해 보다 정밀한 마스크 성능을 확보할 수 있다[7].
출처
[1] OpenCV Color Spaces and Conversion: An Introduction https://blog.roboflow.com/opencv-color-spaces/
[2] [PDF] Human Skin Detection Using RGB, HSV and YCbCr Color Models https://arxiv.org/pdf/1708.02694.pdf
[3] Color spaces in OpenCV https://opencv.org/blog/color-spaces-in-opencv/
[4] I heard <https en wikipedia org wiki HSL and HSV – Kotlin Slack https://slack-chats.kotlinlang.org/t/511897/i-heard-https-en-wikipedia-org-wiki-hsl-and-hsv-hsl-color-sp
[5] Color Filtering/Segmentation/Detection – HSV – Computer Vision https://cvexplained.wordpress.com/2020/04/28/color-detection-hsv/
[6] OpenCV Morphological Operations – PyImageSearch https://pyimagesearch.com/2021/04/28/opencv-morphological-operations/
[7] Choosing the correct upper and lower HSV boundaries for color … https://stackoverflow.com/questions/10948589/choosing-the-correct-upper-and-lower-hsv-boundaries-for-color-detection-withcv
[8] HSL and HSV – Wikipedia https://en.wikipedia.org/wiki/HSL_and_HSV
[9] Color Spaces: S4 Classes and Utilities • colorspace – R Project https://colorspace.r-forge.r-project.org/articles/color_spaces.html
[10] HSL and HSV – Wikipedia, Th.. | PDF | Hue | Rgb Color Model – Scribd https://www.scribd.com/document/38579763/HSL-and-HSV-Wikipedia-Th
[11] HSV Color Mask – Pseudo OpenCV https://pseudopencv.site/utilities/hsvcolormask/
[12] Opencv color ranges for hsv edit https://answers.opencv.org/question/112807/opencv-color-ranges-for-hsv/
[13] Identifying the range of a color in HSV using OpenCV – Stack Overflow https://stackoverflow.com/questions/36817133/identifying-the-range-of-a-color-in-hsv-using-opencv
[14] Simple color detection by Hue – Hue(HSV)값으로 특정색 검출하기 https://s-engineer.tistory.com/139
[15] Changing Colorspaces – OpenCV Documentation https://docs.opencv.org/4.x/df/d9d/tutorial_py_colorspaces.html
[16] Finding suitable HSV color – OpenCV Q&A Forum https://answers.opencv.org/question/232703/finding-suitable-hsv-color/
[17] HSV 색 공간 – 위키백과, 우리 모두의 백과사전 https://ko.wikipedia.org/wiki/HSV_%EC%83%89_%EA%B3%B5%EA%B0%84
[18] HSL and HSV color space – Colors Wiki – Fandom https://colors.fandom.com/wiki/HSL_and_HSV_color_space
[19] Color conversions – OpenCV Documentation https://docs.opencv.org/3.4/de/d25/imgproc_color_conversions.html
[20] Shades of green – Wikipedia https://en.wikipedia.org/wiki/Shades_of_green
답글 남기기