OpenCV-Python之 色彩空间

OpenCV中有数百种关于在不同色彩空间之间的转换的方法。当前,计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue,Saturation,Value)。



  1. 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测。
  2. BGR,即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。另一个与之相似的颜色空间:RGB,它们只是在颜色的顺序上不同。
  3. HSV, H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度(或光谱的另一端的明亮程度)

下面看一下OpenCV色彩空间代码实现以及展示的效果图:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv

def color_space(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    #灰度图
    cv.imshow("gray", gray)
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)      #HSV
    cv.imshow("hsv", hsv)
    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)      #YUV
    cv.imshow("yuv", yuv)
    ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)  #YCrCb
    cv.imshow("ycrcb", ycrcb)

img = cv.imread("F:\\flower.jpg")
cv.namedWindow("image window", cv.WINDOW_AUTOSIZE)
cv.imshow("image window", img)
color_space(img)
cv.waitKey(0)

cv.destroyAllWindows()

原图:


灰度图:


HSV效果图:


YUV效果图:


YCrCb效果图:



接下来我们介绍色彩空间方面从视频文件中过滤某种颜色。

颜色范围表


#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv
import numpy as np


def extract_obj():
    capture = cv.VideoCapture("D:\\02Jumping.wmv") #读取视频文件
    while(True): #判断是否读取成功
        ret, frame = capture.read()
        if ret == False:
            break
        #把视频中的某种颜色过滤出来
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)      # 转换成HSV色彩空间
        lower_hsv = np.array([0, 43, 46])               # 色彩低值(红色)
        upper_hsv = np.array([180, 255, 255])           # 色彩高值
        # lower_hsv = np.array([35, 43, 46])            # 色彩低值(绿色)
        # upper_hsv = np.array([77, 255, 255])          # 色彩高值
        mask =cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)#inRange之后得到的是二值图像
        cv.imshow("video", frame) #显示视频文件
        cv.imshow("mask", mask)
        c = cv.waitKey(30)
        if c == 27:
            break
extract_obj()
cv.waitKey(0)

cv.destroyAllWindows()

运行显示的视频效果如下图:左边是原视频,右边是处理红色色彩空间之后的视频效果



最后介绍通道的分离与合并部分。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv
import numpy as np


#通道的分离
img = cv.imread("F:\\flower.jpg")
cv.namedWindow("image window", cv.WINDOW_AUTOSIZE)
cv.imshow("image window", img)
b, g, r = cv.split(img)
cv.imshow("blue", b)
cv.imshow("green", g)
cv.imshow("red", r)
#通道的合并
src = cv.merge([b, g, r])
src[:, :, 0] = 0
cv.imshow("merger image", img)

cv.waitKey(0)
cv.destroyAllWindows()

运行效果如下:


合并图与原图是不是一样呢?



猜你喜欢

转载自blog.csdn.net/elegentbeauty/article/details/80090774