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

2021-08-09 10:18:35 浏览数 (2)

作者:小郭学数据

源自:快学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

0 人点赞