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()