python3-opencv庫(3)--圖片顏色空間轉換,利用HSV進行物體跟蹤,圖像通道分離與合並
版權聲明:轉載請注明原作者及出處
-
from cv2 import cv2 #或者import cv2
-
import numpy as np
-
-
"""H(hue)色調 0~180;S(saturation)飽和度 0~255;V(value) 0~255
-
具體參見HSV顏色空間的百度百科"""
-
def extract_object_demo():
-
"""通過顏色過濾的方法來跟蹤捕獲視屏中的物體"""
-
"""本函數就是一個追蹤視頻中綠色物體的程序"""
-
capture = cv2.VideoCapture( "D:/movie/星際牛仔BD/星際牛仔Session8ワルツ_フォー_ヴィーナスWaltzForVenus.MP4")
-
#選擇打開一個視屏
-
while True:
-
ret, frame = capture.read()
-
#從視頻中一幀一幀地讀取圖像
-
if ret == False:
-
break
-
#判斷是否讀取正確,讀取失敗(比如視屏結束)則會終止循環,所以ret是個判斷讀取是否正確的返回量
-
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
-
#將視屏每一幀轉換成HSV圖像
-
lower_hsv = np.array([ 35, 43, 46],dtype=np.uint8)
-
#設置HSV范圍下限(是長度為3的1D數組,三個元素分別表示H,S,V的下限)
-
upper_hsv = np.array([ 77, 255, 255],dtype=np.uint8)
-
#設置HSV范圍上限(是長度為3的1D數組,三個元素分別表示H,S,V的上限)
-
#hsv處於該范圍內的就是廣義的綠色,我們就是為了把綠色篩選出來,顏色與HSV值得對應見下方的表
-
mask = cv2.inRange(hsv,lower_hsv,upper_hsv)
-
#第一參數為待處理的圖像,第二參數為HSV范圍下限,第三參數為HSV范圍上限
-
'''cv2.inRange()方法對每一幀圖像進行處理,凡是HSV值處在范圍內的像素,
-
一律為白色,范圍外的一律為黑色,最后返回一張二值化的圖,所謂二值化,就
-
是全圖只有黑白兩色,即mask'''
-
cv2.imshow( "video_initia",frame)
-
cv2.imshow( "video_hsv",hsv)
-
cv2.imshow( "video_mask",mask)
-
k = cv2.waitKey( 20) #設置成按Esc鍵退出循環
-
if k == 27:
-
break
-
-
def color_space_demo(img):
-
"""顏色空間的轉換BGR--->HSV"""
-
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
-
#轉換成灰度圖
-
cv2.imshow( "gray_img",gray)
-
-
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
-
#轉換成HSV
-
cv2.imshow( "hsv_img",hsv)
-
-
yuv = cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
-
#轉換成YUV
-
cv2.imshow( "yuv_img",yuv)
-
-
ycrcb = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)
-
#轉換成YCrCb
-
cv2.imshow( "ycrcb_img",ycrcb)
-
-
-
print( "----------hello python!----------")
-
src = cv2.imread( "Z.PNG")
-
t1 = cv2.getTickCount()
-
#=======================================================
-
color_space_demo(src) #演示各種顏色空間之間的轉換
-
extract_object_demo() #演示通過顏色過濾來跟蹤視頻中的物體
-
#=======================================================
-
t2 = cv2.getTickCount()
-
time = (t2-t1)* 1000/cv2.getTickFrequency()
-
print( "耗時:%s" % time)
-
cv2.waitKey( 0)
-
-
cv2.destroyAllWindows()
由於HSV是基於人類對顏色感覺而定制的標准,所以每種顏色都是用一個范圍來表示
三通道圖像的通道分離以及三個單通道圖像的通道合並
-
from cv2 import cv2 #或者import cv2
-
import numpy as np
-
-
-
print( "--------------------hello python!--------------------")
-
src = cv2.imread( "Z.PNG")
-
t1 = cv2.getTickCount()
-
#====================================================================
-
b, g, r = cv2.split(src) #通道分離,把一副三通道圖像分成3個單通道圖像
-
-
cv2.imshow( "blue",b) #展示分離后每個通道作為單通道圖像的灰度圖
-
cv2.imshow( "green",g)
-
cv2.imshow( "red",r)
-
-
img = cv2.merge([b,g,r]) #通道合並
-
cv2.imshow( "merge_img",img) #展示合並后的圖
-
#====================================================================
-
t2 = cv2.getTickCount()
-
time = (t2-t1)* 1000/cv2.getTickFrequency()
-
print( "耗時:%s" % time)cv2.waitKey( 0)cv2.destroyAllWindows()
