前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV基础 | 4.色彩空间的转换

OpenCV基础 | 4.色彩空间的转换

作者头像
快学Python
发布2021-08-09 10:18:35
4800
发布2021-08-09 10:18:35
举报
文章被收录于专栏:快学Python

作者:小郭学数据

源自:快学python

学习视频可参见python+opencv3.3视频教学 基础入门[1]

今天写的是色彩空间的转换

1.常见色彩空间及色彩空间转换

  • RGB
    • 红色:Red,绿色:Green,蓝色:Blue
  • HSV
    • 色相:Hue(0-180),饱和度:Saturation(0-255),明度;Value(0-255)
    • 常用于颜色检测
  • HSL/HLS
    • 色相:Hue、饱和度:Saturation、亮度:Lightness/Luminance
    • 色相H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°
  • YUV
    • YUV不是几个英文单词的组合词,而是符号,Y表示亮度,UV用来表示色差,U、V是构成彩色的两个分量
    • YUV 色彩模型来源于rgb模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。
  • YCrCb
    • Y:亮度分量,Cb:蓝色色度分量,Cr:红色色度分量
    • YCbCr模型来源于yuv模型,应用于数字视频
    • 常用于肤色检测 色彩空间demo
代码语言:javascript
复制
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)

运行结果如下:

2.跟踪视频中指定颜色,inRange

HSV颜色分量范围

inRange函数说明:

代码语言:javascript
复制
mask = cv2.inRange(hsv, lower, upper)
  • hsv:rgb图像转换为hsv格式的图像
  • lower:图像中低于这个lower的值,图像值变为0,即变为黑
  • upper:图像中高于这个upper的值,图像值变为0,即变为黑
  • 在lower~upper之间的值变成255,即变为白 inRange用于实现图片的二值化

从视频中获取绿色分量代码如下:

代码语言:javascript
复制
# 可从视频中跟踪指定颜色,指定颜色置为白,其余置为黑
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

结果如下:

若想获得红色,蓝色等的分量可以从表中选取对应值进行操作

如果结果想凸显绿色,可进行像素间的与运算得到,下节课提到了。

代码如下:

代码语言:javascript
复制
 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窗口的对比图如下:

3.图像的分离与合并

3.1 分离

#显示各个通道的图像

代码语言:javascript
复制
    b,g,r=cv.split(src)
    cv.imshow("blue",b)
    cv.imshow("green",g)
    cv.imshow("red",r)

原图与各个通道的对比图如下:

将绿色,红色通道置为0,获得新图像。

代码语言:javascript
复制
    src[:,:,2]=0
    src[:,:,1]=0
    cv.imshow("new image",src)

结果如下:

如果取原图和新图的蓝色通道慧发现是一样的,因为蓝色通道的值没有改变

3.2合并

将三通道分离出来的图片合并一起可以发现跟原图是一样的

代码语言:javascript
复制
    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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 快学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.常见色彩空间及色彩空间转换
  • 2.跟踪视频中指定颜色,inRange
  • 3.图像的分离与合并
    • 3.1 分离
      • 3.2合并
      • 结语
        • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档