Python+OpenCV图像处理—— 色彩空间转换

2022-07-29,,,,

一、色彩空间转换

代码如下:

#色彩空间转换
import cv2 as cv
def 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('d:\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 cv
import numpy as np
def 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
      break
extrace_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 cv
src=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] = 0
cv.imshow('modify_image', src)

cv.waitkey(0)
cv.destroyallwindows()

注意:

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

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

以上就是python+opencv图像处理—— 色彩空间转换的详细内容,更多关于python+opencv图像处理的资料请关注其它相关文章!

《Python+OpenCV图像处理—— 色彩空间转换.doc》

下载本文的Word格式文档,以方便收藏与打印。