概述
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)
对图片的某一个通道进行赋值
# 将图片中的B通道全赋值为0
src[:,:,0] = 0
cv.namedWindow("changed image_lose R", cv.WINDOW_NORMAL)
cv.imshow("changed image_lose R", src)
也可以将几个通道进行合并
# 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色彩空间还可以用一个三维的立方体来描述。当三基色分量都为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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复