博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python+OpenCV图像处理(四)—— 色彩空间
阅读量:7089 次
发布时间:2019-06-28

本文共 3086 字,大约阅读时间需要 10 分钟。

一、色彩空间的转换

代码如下:

#色彩空间转换import cv2 as cvdef color_space_demo(img):    gray =  cv.cvtColor(img, cv.COLOR_BGR2GRAY)  #RGB转换为GRAY #这里的生成的gray图是单通道的
cv.imshow("gray", gray) hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) #RGB转换为HSV cv.imshow("hsv", hsv) yuv = cv.cvtColor(img, cv.COLOR_RGB2YUV) #RGB转换为YUV cv.imshow("yuv",yuv) Ycrcb = cv.cvtColor(img, cv.COLOR_RGB2YCrCb) #RGB转换为YCrCb cv.imshow("Ycrcb", Ycrcb) src = cv.imread('E:\imageload\example.png') cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE) cv.imshow('first_image', src) color_space_demo(src) cv.waitKey(0) cv.destroyAllWindows()

运行结果:

 

注意:参考博文:

1.RGB就是指Red,Green和Blue,一副图像由这三个channel(通道)构成

2.Gray就是只有灰度值一个channel。 

3.HSV即Hue(色调),Saturation(饱和度)和Value(亮度)三个channel

 

切记(纯属个人理解):

1.百度百科说,将原来的RGB(R,G,B)中的R,G,B统一按照一种转换关系用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图。

2.opencv里,COLOR_RGB2GRAY是将三通道RGB对象转换为单通道的灰度对象。

3.将单通道灰度对象转换为 RGB 时,生成的RGB对象的每个通道的值是灰度对象的灰度值。

 

 

RGB是为了让机器更好的显示图像,对于人类来说并不直观,HSV更为贴近我们的认知,所以通常我们在针对某种颜色做提取时会转换到HSV颜色空间里面来处理. 

补注:

1.HSV如下图:

2.opencv里HSV色彩空间范围为: H:0-180  S: 0-255   V: 0-255

3.常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV,其中最常用的是RGB、HSV、YUV,其中YUV就是YCrCb(详见百度百科)。其中YUV的“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

 

二、利用inrange函数过滤视频中的颜色,实现对特定颜色的追踪

 代码如下:

#视频特定颜色追踪import cv2 as cvimport numpy as npdef extrace_object_demo():    capture=cv.VideoCapture("E:/imageload/video_example.mp4")    while True:        ret, frame = capture.read()        if ret == False:            break        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)      #色彩空间由RGB转换为HSV        lower_hsv = np.array([100, 43, 46])             #设置要过滤颜色的最小值        upper_hsv = np.array([124, 255, 255])           #设置要过滤颜色的最大值        mask = cv.inRange(hsv, lower_hsv, upper_hsv)    #调节图像颜色信息(H)、饱和度(S)、亮度(V)区间,选择蓝色区域        cv.imshow("video",frame)        cv.imshow("mask", mask)        c = cv.waitKey(40)        if c == 27:      #按键Esc的ASCII码为27            breakextrace_object_demo()cv.destroyAllWindows()

运行结果:

这里只放追踪蓝色部分的截图,仅供参考

注意:

1.Opencv的inRange函数:可实现二值化功能

函数原型:inRange(src,lowerb, upperb[, dst]) -> dst         

  函数的参数意义:第一个参数为原数组,可以为单通道,多通道。第二个参数为下界,第三个参数为上界

例如:mask = cv2.inRange(hsv, lower_blue, upper_blue)      

  第一个参数:hsv指的是原图(原始图像矩阵)

  第二个参数:lower_blue指的是图像中低于这个lower_blue的值,图像值变为255

  第三个参数:upper_blue指的是图像中高于这个upper_blue的值,图像值变为255 (255即代表黑色)

  而在lower_blue~upper_blue之间的值变成0 (0代表白色)

即:Opencv的inRange函数可提取特定颜色,使特定颜色变为白色,其他颜色变为黑色,这样就实现了二值化功能

2.HSV颜色对应的RGB分量范围表如下:(这里是三通道的)

 

三、通道的分离、合并以及某个通道值的修改

代码如下:

#通道的分离与合并以及某个通道值的修改import cv2 as cvsrc=cv.imread('E:\imageload\example.png')cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)cv.imshow('first_image', src)#三通道分离形成单通道图片b, g, r =cv.split(src)cv.imshow("second_blue", b)cv.imshow("second_green", g)cv.imshow("second_red", r)# 其中cv.imshow("second_red", r)可表示为r = cv2.split(src)[2]#三个单通道合成一个三通道图片src = cv.merge([b, g, r])cv.imshow('changed_image', src)#修改多通道里的某个通道的值src[:, :, 2] = 0cv.imshow('modify_image', src)cv.waitKey(0)cv.destroyAllWindows()

注意:

1.这里用到了opencv的split函数和merge函数,实现通道的分离和合并。

2.cv.split函数分离出的b、g、r是单通道图像

 

转载于:https://www.cnblogs.com/FHC1994/p/9002331.html

你可能感兴趣的文章
PHP json_decode object时报错Cannot use object of type stdClass as array
查看>>
hibernate一对一外键双向关联
查看>>
SharePoint 2013 同步FBA认证用户
查看>>
二叉树的遍历实现
查看>>
Sublimetext 3 经常使用插件
查看>>
flutter安装开发环境-问题记录
查看>>
第十四课时: 登录/登出以及JWT认证
查看>>
渲染机制/页面性能/错误监控
查看>>
Dom中高big 事件总结(持续更新中)
查看>>
Immutable.js 源码解析 --List 类型
查看>>
【修真院“善良”系列之十六】代码结构中Dao,Service,Controller,Util,Model是什么意思,为什么划分...
查看>>
js数据结构-栈
查看>>
前端构建_webpack
查看>>
Looper源码
查看>>
微信小程序开发系列五:微信小程序中如何响应用户输入事件
查看>>
程序员如何优雅的记录笔记(同步云端,图床,多端发布)
查看>>
极速高清——给你带来全新的高清视野
查看>>
数据结构之链表【上】
查看>>
Go并发实战笔记整理
查看>>
我们的手机用上北斗导航了吗?
查看>>