欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-03 18:45:55
一、色彩空间的转换代码如下:#色彩空间转换import cv2 as cvdef color_space_demo(img): gray = cv.cvtcolor(img, cv.color_bg...

一、色彩空间的转换

代码如下:

#色彩空间转换
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()

运行结果:

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

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)就是灰度图。

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

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

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

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

补注:

1.hsv如下图:

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

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()

运行结果:

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

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

注意:

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分量范围表如下:(这里是三通道的)

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

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

代码如下:

#通道的分离与合并以及某个通道值的修改
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图像处理的资料请关注其它相关文章!