📌 Intro
BGR to HSV로의 색상변경, 비디오에서 특정 색상을 가진 물체 추출하는 방법에 대해 알아보자. 사용하는 라이브러리는 openCV이며 함수는 cv2.cvtColor(), cv2.inRange() 다.
📌 BGR to HSV
색상은 보통 R(Red), G(Green), B(Blue)로 이루어져 있으며 각각 0~255사이의 숫자를 가져 특정한 색을 만들어낼 수 있다.
HSV는 Hue(색상), Saturation(채도), Value(명도)로 각각 0~179, 0~255, 0~255 범위의 값을 가진다. HSV 중 H에 해당하는 색상을 이용하여 이미지에서 원하는 색상을 가진 물체를 추출할 수 있다.
HSV를 사용하기 위해서는 BGR 색상 값을 이용하여 바꿔줄 수 있다.
import cv2
import numpy as np
red = np.uint8([[[0, 0, 255]]])
hsv = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print(hsv)
출력 결과는 [0, 255, 255]다. 어떠한 색과 비슷한 계열의 색상은 [Hue-10, 100, 100] ~ [Hue+10, 255, 255]까지의 범위로 나타냘 수 있다. 그래서 붉은색은 [-10, 100, 100] ~ [10, 255, 255]범위로 볼 수 있다.
📌 영역 추출하기
소스코드
import cv2
import numpy as np
# 이미지 로드
img = cv2.imread('100GOPRO-GOPR0201.JPG')
# 붉은색 계열 범위
lower_red = np.array([-10, 100, 100])
upper_red = np.array([10, 255, 255])
# BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_red, upper_red)
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
설명
붉은색 계열 범위는 앞서 설명한 것처럼 [-10, 100, 100] ~ [10, 255, 255]범위로 설정했다.
- cv2.cvtColor()
이미지의 컬러를 변경한다. - cv2.inRange()
hsv의 모든 값을 lower_red, upper_red의 범위에 있는지 확인하고 범위에 포함되면 해당 값을, 범위에 포함되지 않는다면 0으로 채워 결과를 반환한다. - cv2.bitwise_and()
이미지 두 개에 대해 and 연산을 진행한다.
결과화면
원본 이미지이다. 이 이미지에서 붉은색 펜을 추출해볼 것이다.
원본 이미지에서 범위에 포함되는 색상외는 0으로 채운 마스크 이미지다. 원본 이미지에서 봤던 붉은색 펜의 영역이 잘 추출된 것을 볼 수 있다.
원본 이미지와 마스크 이미지를 bitwise_and()연산을 하여 붉은색 펜만 추출한 것을 확인할 수 있다.