관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[openCV] HSV 특정색 검출하기 본문

OpenCV

[openCV] HSV 특정색 검출하기

막무가내막내 2019. 7. 15. 02:04
728x90
import numpy as np
import cv2

# BGR(파랑색)
color = [255, 0, 0]
# cvtColor 함수의 입력으로 사용할 수 있도록 한 픽셀로 구성된 이미지로 변환한다.
pixel = np.uint8([[color]])
# cvtColor를 사용하여 HSV 색공간으로 변환한다.
hsv = cv2.cvtColor(pixel, cv2.COLOR_BGR2HSV)
# HSV값을 출력하기위해 픽셀값만 갖고온다.
hsv = hsv[0][0]

# bgr과 hsv 값 출력
print("bgr: ", color)
print("hsv: ", hsv)
import cv2

# 이미지파일을 컬러로 읽어온다.
img_color = cv2.imread('food.jpg')
# 이미지의 높이와 너비를 갖고온다.
height,width = img_color.shape[:2]

# hsv이미지로 변환한다.
img_hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)

# 범위를 정하여 hsv이미지에서 원하는 색 영역을 바이너리 이미지로 생성한다.
# (가운데와 마지막값은 너무어두워서 검은색에 가까운색과 너무 옅어서 흰색에 가까운색을 제외시키기위해 30으로해야한다.
lower_blue = (120-10, 30, 30)
upper_blue = (120+10, 255, 255)
# 앞서 선언한 범위값을 사용하여 바이너리 이미지를 얻는다.(범위내에 있는 픽셀들은 흰색이되고 나머지는 검은색이 된다.)
img_mask = cv2.inRange(img_hsv, lower_blue, upper_blue)

# 원본이미지에서 범위값에 해당하는 영상부분을 흭득한다.
img_result = cv2.bitwise_and(img_color, img_color, mask = img_mask)

# 화면에 영상결과들 보여준다.
cv2.imshow('img_color', img_color)
cv2.imshow('img_mask', img_mask)
cv2.imshow('img_result', img_result)

# 키보드입력대기함수 및 자원해제
cv2.waitKey(0)
cv2.destroyAllWindows()

색공간은 색을 표현하는 방법을 3차원 좌표계로 표시한것이다. 

HSV 색공간
RGB색공간(RED: X, GREEN: Y , BLUE :Z)

RGB 색공간은 색을 혼합하면 명도가 올라가는 가상 혼합방식으로 색을 표현한다.

BGR과 RGB는 보다시피 BLUE와 RED의 채널순서만 다를 뿐 같은 원리이다.

 

HSV 색 공간 또는 HSV 모델은 색을 표현하는 하나의 방법이자, 그 방법에 따라 색을 배치하는 방식이다. 색상(Hue), 채도(Saturation), 명도(Value)의 좌표를 써서 특정한 을 지정한다.

 

RGB색공간은 3개의 채널이 혼합하여 색을 표현하기 때문에  원하는 색의 범위를 정하기 어렵다. 그래서 HSV 색공간으로 변환하여 원하는 색의 범위를 정한다.  즉 HSV는 원하는 색의 범위를 정하기가 쉽다. H(HUE색상)가 일정한 범위를 갖는 순수한 색 정보를 가지고 있기 떄문이다. (다음그림참고)

 

 

 

S(채도)는 색상의 진함을 의미한다.  값이 클수록 진해진다.  작아질수록 흰색에 가까워진다.

오픈씨브이에서는 0~255까지의 범위를 가진다.

V(명도)는  색상의 밝은 정도를 의미한다. 검은색을 0으로 했을 때 값이 커질 수록 색상이 밝아진다. 

 

 

출처 및 참고:

https://ko.wikipedia.org/wiki/HSV_%EC%83%89_%EA%B3%B5%EA%B0%84

https://www.123rf.com/photo_65990122_color-colors-wheel-names-degrees-rgb-hsb-hsv-hue.html

https://gammabeta.tistory.com/390

https://www.youtube.com/watch?v=0KCTvoMXHPE&list=PLwfJJiO20qkDue05S5MNhgYNnClMVlagN&index=1

 

728x90
Comments