一、色彩空間
1、什么是色彩空間?
色彩空間是定義的顏色范圍。
2、常見的色彩空間有哪些?
①RGB
②HSV
在OpenCV中,Hue的值為0~180°,之所以不是360°是因為,8位存不下,故進行歸一化操作,使得Hue取值在0 ~180°,可以通過一個字節來存儲。
③HIS
Hue:色調
Intensity:強度
Saturation :飽和度
④YCrCb
主要在早期的人的皮膚檢測方面應用
⑤YUV
Android開發中常用,Linux的色彩空間
3、色彩空間之間的相互轉化
import cv2def color_space(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv2.imshow("gray",gray)hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)cv2.imshow("hsv",hsv)yuv = cv2.cvtColor(image,cv2.COLOR_BGR2YUV)cv2.imshow("yuv",yuv)ycrcb = cv2.cvtColor(image,cv2.COLOR_BGR2YCrCb)cv2.imshow("ycrcb",ycrcb)src = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()
color_space(src)
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
運行效果圖如下:
二、對視頻中的目標(青色水杯)進行跟蹤
cv2.inRange(hsv,lowerb=lower,upperb=upper)
:對HSV顏色過濾,lowerb和upperb需要查上面的表進行顏色轉換
方法一:目標物體白色,其余黑色
import cv2
import numpy as npdef extrace_object():capture = cv2.VideoCapture("G:/Juptyer_workspace/study/data/yy.mp4")while(True):ret,frame = capture.read()if ret==False:breakhsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower = np.array([78,43,46])#由于水杯是青色的故需要根據表格選出hsv對應的min值upper = np.array([99,255,255])#由于水杯是青色的故需要根據表格選出hsv對應的max值mask = cv2.inRange(hsv,lowerb=lower,upperb=upper)cv2.imshow("video",frame)cv2.imshow("mask",mask)c = cv2.waitKey(40)if c==27:breakt1 = cv2.getTickCount()
extrace_object()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下:
方法二:目標物體顏色保留,其余黑色
import cv2
import numpy as npdef extrace_object():capture = cv2.VideoCapture("G:/Juptyer_workspace/study/data/yy.mp4")while(True):ret,frame = capture.read()if ret==False:breakhsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower = np.array([78,43,46])#由于水杯是青色的故需要根據表格選出hsv對應的min值upper = np.array([99,255,255])#由于水杯是青色的故需要根據表格選出hsv對應的max值mask = cv2.inRange(hsv,lowerb=lower,upperb=upper)dst = cv2.bitwise_and(frame,frame,mask=mask)cv2.imshow("video",frame)#cv2.imshow("mask",mask)cv2.imshow("dst",dst)c = cv2.waitKey(40)if c==27:breakt1 = cv2.getTickCount()
extrace_object()
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下:
三、對彩色圖像三顏色通道進行分割顯示并合并顯示
cv2.split(src)
:對src三顏色通道的彩色圖像進行分割
cv2.merge([b,g,r])
:將b,g,r三個單顏色通道圖像進行合并
import cv2
import numpy as npsrc = cv2.imread("G:/Juptyer_workspace/study/opencv/opencv3/cat.png")#BGR
cv2.namedWindow("input image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image",src)
t1 = cv2.getTickCount()b,g,r = cv2.split(src)#拆分彩色通道圖像
cv2.imshow("blue",b)
cv2.imshow("green",g)
cv2.imshow("red",r)src = cv2.merge([b,g,r])#將拆分的三個單顏色通道進行合并還原
src[:,:,0]=0#將第0個顏色通道,即B顏色通道賦值為0
cv2.imshow("changed",src)t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()#顯示當前運行時間
print("time:%s ms"%(time*1000))#輸出當前運行時間單位為ms
cv2.waitKey(0)cv2.destroyAllWindows()
效果圖如下: