Digital Image
디지털 영상은 2차원 행렬의 형태로 표현. Bitmap Image라고도 한다.
각 pixel의 위치는 영상좌표와 행렬 위치로 2가지 방식으로 표현된다.
영상 좌표는 좌측 상단의 꼭지점을 중심으로 (x,y)로 표현하고, 행렬 위치는 (r,c)로 표현한다.
Binary Image
Binary Image는 pixel당 1bit로 표현하는 영상을 의미. 흑백 이미지로 표현된다.
Grayscale Image
Grayscale Image는 Pixel당 8bit(1Byte), 즉 256단계의 명암(빛의 세기)을 표현할 수 있는 이미지이다.
Color Image
Color 이미지는 pixel의 색을 표현하기 위해서 pixel당 24bit(3Byte)를 사용한다. 각 pixel은 RGB 각각 0~255의 값으로 표현하고 OpenCV에서는 BGR 순서로 표현을 한다. 이러한 이미지를 True color image라고 한다.
컬러 이미지에는 RGB 모델과 HSV 모델 등의 표현 방식이 존재한다.
RGB 모델은 RGB인 빨간색,초록색,파란색을 기본 색으로 사용을 한다.
HSV 모델은 색상, 채도, 명도로 표현한다.
HSV 형식
H(Hue) : 색상. 일반적인 색을 의미. 색이 각도로 표현이 됨. [0,180]
S(Saturation) : 채도. 색의 순수성을 의미. 짙다, 흐리다로 표현이 됨. [0,255]
V(Value) : 명도. 색의 밝고 어두운 정도. 수직축의 깊이로 표현. 어둡다 밝다로 표현이 됨. [0,255]
# OpenCV 색 공간 변환, 마스킹 함수
cv2.cvtColor(frame,cv2.COLOR_BGR2HSV): BGR 형식을 HSV형식으로 변환
cv2.inRange(frame_hsv,lowerb,upperb[,dst]): HSV형식 이미지의 하한과 상한을 정하여 마스크 생성
import cv2
import numpy as np
import matplotlib.pyplot as plt
def tracking():
try:
print("카메라 구동")
cap = cv2.VideoCapture('Coastline.mp4')
cv2.namedWindow('Original',cv2.WINDOW_GUI_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.namedWindow('Blue',cv2.WINDOW_GUI_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.namedWindow('Green',cv2.WINDOW_GUI_NORMAL|cv2.WINDOW_KEEPRATIO)
cv2.namedWindow('Red',cv2.WINDOW_GUI_NORMAL|cv2.WINDOW_KEEPRATIO)
except:
print("카메라 구동 실패")
return
while True:
ret, frame = cap.read()
if ret:
frame_hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
lower_blue = np.array([100,100,100])
upper_blue = np.array([140,255,255])
lower_green = np.array([40,100,100])
upper_green = np.array([80,255,255])
lower_red = np.array([-10,100,100])
upper_red = np.array([30,255,255])
mask_blue = cv2.inRange(frame_hsv,lower_blue,upper_blue)
mask_green = cv2.inRange(frame_hsv,lower_green,upper_green)
mask_red = cv2.inRange(frame_hsv,lower_red,upper_red)
res1 = cv2.bitwise_and(frame,frame,mask=mask_blue)
res2 = cv2.bitwise_and(frame,frame,mask=mask_green)
res3 = cv2.bitwise_and(frame,frame,mask=mask_red)
cv2.imshow('Original',frame)
cv2.imshow('Blue',res1)
cv2.imshow('Green',res2)
cv2.imshow('Red',res3)
k = cv2.waitKey(20) & 0xFF
if k==27:
break
else:
print("비디오 종료")
break
cap.release()
cv2.destroyAllWindows()
tracking()