上篇文章我们说了有关色彩的问题,RGB只是一种色彩空间,除了它之外我们还有很多色彩空间,这篇重点说一下色彩空间的转换以及在hsv色彩空间中对于颜色的提取。我们先来看代码:
import cv2 as cv
import numpy as np
#建议先跳过这个函数去看下面的色彩空间转换函数,看完了再回过头看这个函数
def extrace_object_demo():#这个函数用来处理视频
capture=cv.VideoCapture("1269942405.mp4")#首先我们读入了一个视频
while(True):
ret,frame=capture.read()#读这个视频的每一帧
if ret==False:
break
hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)#转换为hsv色彩空间
lower_hsv=np.array([0,0,0])
higher_hsv=np.array([180,255,46])
#给定两组阈值,这两组阈值可以限制出一个颜色来,比如我这里限制的是黑色
mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=higher_hsv)
#上面就用到了那两个阈值,我们根据这两个阈值划出了黑色
cv.imshow("video",frame)#显示原图像
cv.imshow("mask",mask)
#显示出提取出黑色的图像,这里面原视频中黑色的部分会变成白色
c=cv.waitKey(40)
if c==27:
break
def color_space_demo(image):
#opencv提供的api可以方便的进行色彩空间的转换
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#变成灰度值图像,这个上篇中讲过
cv.imshow("gray",gray)
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
#变成hsv图像
cv.imshow("hsv",hsv)#H:0-180 S:0-255 V:0-255
yuv=cv.cvtColor(image,cv.COLOR_BGR2YUV)
#变成yuv图像
cv.imshow("yuv",yuv)
Ycrcb=cv.cvtColor(image,cv.COLOR_BGR2YCrCb)
#变成YCrCb图像
cv.imshow("Ycrcb",Ycrcb)
src=cv.imread(r"C:\Users\DELL\Desktop\TIM20180421221302.png")
cv.namedWindow("impot image",cv.WINDOW_AUTOSIZE)
b,g,r=cv.split(src)
cv.imshow("blue",b)
cv.imshow("green",g)
cv.imshow("red",r)#分割颜色,这个不是重点,要配合下面一起
src=cv.merge([b,g,r])#把颜色组合到一起
src[:,:,0]=0#给这一列赋值
cv.imshow("changed image",src)
#最终这里会得到一个根据上一行赋值不同而不同的图像
extrace_object_demo()#图像函数
#cv.imshow("input image",src)
cv.waitKey(0)
cv.destroyAllWindows()
代码就分析这么多,然后还有一点,就是上面的那个提取图像中的颜色,阈值是这样的:
也就是说我们只需要给出这个表上的阈值,就可以提取出相应的颜色,然后填的方式是那个lower里面就填min里面的,也就是填这一列中最小的三个,然后higher中填的就是这一列中最大的三个,其实也就是其他三个,但是要一一对应,就是这个min要对应它下面的max