我是靠谱客的博主 沉默薯片,最近开发中收集的这篇文章主要介绍Python-Opencv中的常用的两个色彩空间色彩空间(BGR和HSV),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python-Opencv中常用的两个色彩空间(BGR和HSV)及处理

颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间。但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象。颜色空间按照基本机构可以分为两大类:基色颜色空间和色、亮分离颜色空间。前者典型的是RGB,后者包括HSV等等。

各个空间中不同参数的描述归根到底都是对颜色的描述

BGR色彩空间

1、计算机色彩显示器和彩色电视机显示色彩的原理一样,都是采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。这种色彩的表示方法称为RGB色彩空间表示。

2、在RGB色彩空间中,任意色光F都可以用R、G、B三色不同分量的相加混合而成:F=r[R]+r[G]+r[B]。按照排列组合:RGB都有0-255中256个值,三色中的每一个值进行叠加都可以得到一种颜色,故有256 × 256 × 256 = 16777216种颜色。

以下代码为对RGB色彩空间的每一个通道 R G B 进行分离

src = cv.imread("girl.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# 用 cv.split(src) 对 RBG 三通道进行分离
b, g , r =cv.split(src)
# 显示每个通道下的图片
cv.imshow("blue", b)
cv.imshow("green", g)
cv.imshow("red", r)

从原图将BGR三个通道分离出来的结果
对图片的某一个通道进行赋值

# 将图片中的B通道全赋值为0 
src[:,:,0] = 0
cv.namedWindow("changed image_lose R", cv.WINDOW_NORMAL)
cv.imshow("changed image_lose R", src)

这就是将B通道全赋值为0后的图片

也可以将几个通道进行合并

# cv.merge([b, g, r]) 将几个通道进行合并成新图片
merge_channel_src = cv.merge([b, g, r])
cv.namedWindow("merge_channel_src", cv.WINDOW_NORMAL)
cv.imshow("merge_channel_src", merge_channel_src)

将RGB三个通道进行合并
RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。
在这里插入图片描述

HSV色彩空间

HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
在这里插入图片描述

在HSV色彩中间中每一种颜色对应的 H S V三参数范围
在这里插入图片描述
在很多时候,我们都是在用HSV来进行对图像做处理

代码如下:

import cv2 as cv
import numpy as np
# 提取视频中的蓝色车牌
def extract_object_demo():
	# cv.VideoCapture()对视频进行捕获
    capture = cv.VideoCapture("车牌跟踪视频.mp4")
    while True:
    	# capture.read()对捕获的视频进行每一帧读取,返回 ret 和 frame
    	# 其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。
		# frame就是每一帧的图像,是个三维矩阵。
        ret, frame = capture.read()
        # 如果对捕获视频读取桢错误就退出循环
        if not ret:
            break
        # 将捕获视频每一帧图像进行从RGB色彩空间到HSV色彩空间的转换 
        # cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        # 提取每一帧图像里面想要的颜色
        # 用 cv.inRange(hsv, lowerb, upperb)进行提取
        # 其中hsv为色彩空间变换后的图片数据
        # 其中lowerb(数组)为HSV色彩空间中你所需提取颜色 H S V三个参数的最小值
        # 其中upperb(数组)为HSV色彩空间中你所需提取颜色 H S V三个参数的最大值
        lower_hsv = np.array([0, 0, 221])
        upper_hsv = np.array([180, 30, 255])
        mask = cv.inRange(hsv, lowerb = lower_hsv, upperb = upper_hsv)# 对原图像进行显示
        cv.imshow("video", frame)
        # 对处理后的图片进行显示
        cv.imshow("mask", mask)
        # waitKey(a)相当于延时a毫秒再到下一帧
        c = cv.waitKey(40)
        # c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立
        if c == 27:
            break

extract_object_demo()
# 提取静态图片中的的所需颜色,本例提取车牌白色
def extract_card_demo(image):
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
    lower_hsv = np.array([0, 0, 221])
    upper_hsv = np.array([180, 30, 255])
    # 此处提取的是静态车牌的白色 其中 lowerb upperb 就应该该相应的白色取值范围内
    mask = cv.inRange(hsv, lowerb = lower_hsv, upperb = upper_hsv)
    cv.imshow("mask", mask)
    cv.waitKey(0)

# 读取图片
src = cv.imread("p.jpg")
# 创建窗口
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
# 显示原图
cv.imshow("input image", src)
# 进入车牌白色字体提取函数
extract_card_demo(src)
# # cv.waitKey(0) 则表示程序会无限制的等待用户的按键事件,说明就卡这在了这一帧
cv.waitKey(0)
# 关闭所有窗口
cv.destroyAllWindows()

在这里插入图片描述

初学Opencv,如有错误地方和改进地方,真诚地邀请您提出来,谢谢!

本文结束…

最后

以上就是沉默薯片为你收集整理的Python-Opencv中的常用的两个色彩空间色彩空间(BGR和HSV)的全部内容,希望文章能够帮你解决Python-Opencv中的常用的两个色彩空间色彩空间(BGR和HSV)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部