作者:小郭学数据
源自:快学python
学习视频可参见python+opencv3.3视频教学 基础入门[1]
今天写的是色彩空间的转换
def color_space_demo(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
cv.imshow("hsv",hsv)
hls=cv.cvtColor(image,cv.COLOR_BGR2HLS)
cv.imshow("hls",hls)
yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
cv.imshow("yuv", yuv)
ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
cv.imshow("ycrcb", ycrcb)
运行结果如下:
HSV颜色分量范围
inRange函数说明:
mask = cv2.inRange(hsv, lower, upper)
从视频中获取绿色分量代码如下:
# 可从视频中跟踪指定颜色,指定颜色置为白,其余置为黑
def extract_object_demo():
capture=cv.VideoCapture("./images/vtest.avi")
while(True):
ret,frame=capture.read()
if ret ==False:
break
hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)
lower_hsv = np.array([35, 43, 46]) # 对应的绿色的hsv中h,s,v的最小值
upper_hsv = np.array([77, 255, 255]) #对应的绿色的hsv中的h,s,v最大值
mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
cv.imshow("video",frame)
cv.imshow("mask",mask)
c=cv.waitKey(40)
if c==27:
break
结果如下:
若想获得红色,蓝色等的分量可以从表中选取对应值进行操作
如果结果想凸显绿色,可进行像素间的与运算得到,下节课提到了。
代码如下:
mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=upper_hsv)
dst=cv.bitwise_and(frame,frame,mask=mask)
cv.imshow("video",frame)
cv.imshow("mask",mask)
cv.imshow("dst",dst)
video与dst窗口的对比图如下:
#显示各个通道的图像
b,g,r=cv.split(src)
cv.imshow("blue",b)
cv.imshow("green",g)
cv.imshow("red",r)
原图与各个通道的对比图如下:
将绿色,红色通道置为0,获得新图像。
src[:,:,2]=0
src[:,:,1]=0
cv.imshow("new image",src)
结果如下:
如果取原图和新图的蓝色通道慧发现是一样的,因为蓝色通道的值没有改变
将三通道分离出来的图片合并一起可以发现跟原图是一样的
src=cv.merge([b,g,r]) #merge第一个参数mv是数组形式
cv.imshow("change_image",src)
以上内容仅是自我学习时记录的笔记,欢迎大家批评指正,一起学习进步。
[1]
python+opencv3.3视频教学 基础入门: https://www.bilibili.com/video/BV1QW411F7e7?p=1