이미지 Processing¶
Goal¶
- 디지털 영상의 표현 방법에 대해서 알 수 있다.
- Color-space중 Binary Image, Grayscale, RGB, HSV에 대해서 알 수 있다.
- 각 Color-space 변환 방법에 대해서 알 수 있다.
- 동영상에서 간단한 Object Tracking을 할 수 있다.
cv2.cvtColor()
,cv2.inRange()
함수에 대해서 알 수 있다.
Digital Image¶
Digital Image의 유형¶
Binary Image¶
Binary Image는 pixel당 1bit로 표현하는 영상을 의미합니다. 즉 흰색과 검은색으로만 표현이 되는 영상입니다.
위 이미지에서 좌측 상단의 이미지가 원본 이미지 입니다. 원본 이미지를 thresholding처리를 하여 binary image로 변환한 결과가 우측 상단의 이미지 입니다. 우측 하단의 이미지는 화면에 표현할 때 사용하는 방법으로 binary image의 밀도를 조절하여 밝기를 표현 하는 방법입니다. 이를 dithering 이라고 합니다.
Color Image¶
Color 이미지는 pixel의 색을 표현하기 위해서 pixel당 24bit를 사용합니다. 총 16,777,216 가지의 색을 표현할 수 있습니다. 이것을 일반적으로 True color image라고 합니다. pixel은 RGB 각각을 위해서 8bit를 사용하게 됩니다. OpenCV에서는 BGR로 표현을 하기 때문에 Blue->(255,0,0), Green->(0,255,0), Red->(0,0,255), White->(255,255,255), Black->(0,0,0)으로 표현할 수 있습니다.
각 pixel당 3Byte를 사용하기 때문에 용량이 큽니다. 이를 해결하기 위해서 lookup table을 사용하여, 해당 pixel에는 index만 을 저장하기도 합니다.
HSV Color-space¶
이미지 처리에서 가장 많이 사용되는 형태의 Color 모델입니다. 하나의 모델에서 색과 채도, 명도를 모두 알 수 있습니다. 원뿔 형태의 모델로 표현이 됩니다.
HSV의 의미는 다음과 같습니다.
- H(ue) : 색상. 일반적인 색을 의미함. 원추모형에서 각도로 표현이 됨.(0: Red, 120도 : Green, 240: Blue)
- S(aturation) : 채도. 색읜 순수성을 의미하며 일반적으로 짙다, 흐리다로 표현이 됨. 중심에서 바깥쪽으로 이동하면 채도가 높음.
- V(alue) : 명도. 색의 밝고 어두운 정도. 수직축의 깊이로 표현. 어둡다 밝다로 표현이 됨.
Color-space 변환¶
OpenCV에는 150여가지 변환 방법이 있습니다. 아래는 변환 방법을 확인하는 코드 입니다.
>>> import cv2
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>> print flags
그 중에 서 많이 사용되는 BGR<->Gray, BGR<->HSV에 대해서 알아 보겠습니다.
변환을 위해서 사용하는 함수는 cv2.cvtColor()
함수 입니다.
-
cv2.
cvtColor
(src, code)¶ Params src: image Params code: 변환 코드
BGR->Grayscale로 변환하기 위해서는 cv2.COLOR_BGR2GRAY 를 사용합니다. BGR->HSV로 변환하기 위해서는 cv2.COLOR_BGR2HSV 를 사용합니다.
Note
Hue는 [0,179], Saturation은 [0,255], Value는 [0,255]로 표현이 됩니다.
Object Tracking¶
다음 예제는 단순한 Object Tracking입니다. 영상에서 파란색 부분을 찿아서 binary image로 보여줍니다.
- Video로 부터 Frame을 읽어 들입니다.
- frame을 HSV로 변환을 합니다.
- 변환한 이미지에서 blue 영역을 찾아서 mask를 생성합니다.
- frame에 mask를 적용하여 이미지를 보여 줍니다.
Code는 아래와 같습니다.
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #-*- coding: utf-8 -*-
import cv2
import numpy as np
# Camera 객체를 생성 후 사이즈르 320 X 240 으로 조정.
cap = cv2.VideoCapture(0)
cap.set(3,320)
cap.set(4,240)
while(1):
# camera에서 frame capture.
ret, frame = cap.read()
if ret:
# BGR->HSV로 변환
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# blue 영역의 from ~ to
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
#이미지에서 blue영역
mask = cv2.inRange(hsv, lower_blue, upper_blue)
#bit연산자를 통해서 blue영역만 남김.
res = cv2.bitwise_and(frame, frame, mask = mask)
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
|
Result
참고로 HSV의 색 영역을 확인하는 방법은 아래와 같습니다.
>>> green = np.uint8[[[0,255,0]]]
>>> green_hsv = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
>>> print green_hsv
[[[60, 255, 255]]]
위 결과에서 [H-10,100,100]과 [H+10,255,255]와 같이 상하한선을 정하여 색 영역 범위를 확인할 수 있습니다.