OpenCV-色彩空间

文章目录

  • 色彩空间
    • Gray灰度图
    • RBG
    • HSV
    • HLS
  • 色彩空间的转换
    • cv2.cvtColor
    • 示例
    • ==错误记录==
  • 色彩阀值化处理
    • cv2.inRange
    • 示例
  • 通道的分离与合并
    • cv2.split
    • cv2.merge
    • 示例

色彩空间

Gray灰度图

GARY色彩空间(灰度图像)通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]。不同数值表示不同程度的灰色。像素值越低,灰色越深。0表示纯黑色,255表示纯白色。注意这个值不是RGB里的任何一个元素。
GARY色彩空间为单通道,所以通常用二维数组表示一幅灰度图像。
其中二值图像:只有0和255两种像素值的灰度图像

RBG

OpenCV中通道排序为BGR

  • B(Blue) 蓝色 取值范围:[0,255]
  • G(Green) 绿色 取值范围:[0,255]
  • R(Red) 红色 取值范围:[0,255]

RGB是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色®,绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。

RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。
F = r [ R ] + r [ G ] + r [ B ] F=r[R]+r[G]+r[B] F=r[R]+r[G]+r[B]
在这里插入图片描述

RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。

自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而RGB颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。

RGB颜色空间适合于显示系统,却并不适合于图像处理在HSV颜色空间下,比BGR更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

HSV

OpenCV中通道排序为HSV

  • H(Hue) 色调,色相 取值范围:[0,179](归一化处理了,为了能用一个字节存下)
  • S(Saturation) 饱和度,色彩纯净度 取值范围:[0,255]
  • V(Value) 明度 取值范围:[0,255]

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

在这里插入图片描述

在图像处理中使用较多的是HSV颜色空间,它比RGB更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。

在HSV 颜色空间下,比BGR更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

HLS

  • H(Hue) 色相
  • L(Lightness) 亮度
  • S(Saturation) 饱和度

HSL和HSV稍有区别,一般我们常用的是HSV模型。

HLS中的L分量为亮度,亮度为100,表示白色,亮度为0,表示黑色;HSV 中的 V 分量为明度,明度为100,表示光谱色,明度为0,表示黑色。
在这里插入图片描述
为什么HSV有圆锥和圆柱两种定义,参考链接如下:

  • 关于HSV模型的探讨

参考链接:

  • HSV颜色空间
  • 三分钟带你快速学习RGB、HSV和HSL颜色空间
  • opencv 色彩空间
  • 关于HSV模型的探讨

色彩空间的转换

BGR到HSV色彩转换表
在这里插入图片描述

cv2.cvtColor

  • src:原图像
  • code:color转化代码
  • dst:输出图像
  • dstCn:输出通道
def cvtColor(src: Any,code: Any,dst: Any = None,dstCn: Any = None) -> dst

示例

色彩空间的转换

import cv2 as cv
 
 
#色彩空间的转换
def color_space_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#RGB转换为gray
    cv.imshow("gray", gray)
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)#RGB转换为hsv
    cv.imshow("hsv", hsv)
    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)#RGB转换为yuv
    cv.imshow("yuv", yuv)

错误记录

显示No module named ‘cv2’
是因为缺少了OpenCV的cv2模块,需要导入这个包

色彩阀值化处理

cv2.inRange

将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)

inRange(src, lowerb, upperb[, dst]) -> dst
  • hsv指的是原图
  • lower_red指的是图像中低于这个lower_red的值,图像值变为0
  • upper_red指的是图像中高于这个upper_red的值,图像值变为0

注意:
在lower_red~upper_red之间的值变成255,其余的为0

示例

从视频中提取指定颜色范围,并做二值化处理(黑白)

def extract_object():
    """从视频中获取提取指定颜色范围"""
    capture = cv.VideoCapture("car.mp4")
    while True:
        ret, frame = capture.read()
        if not ret:
            break

        hsv = cv.cvtColor(frame, cv.COLOR_RGB2HSV)
        lower_hsv = np.array([35, 43, 46])  # hsv的最小值
        upper_hsv = np.array([77, 255, 255])  # hsv的最大值
        # 用inRange函数提取指定颜色范围,这里是对hsv来处理
        mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
        cv.imshow("mask", mask)

        keyboard = cv.waitKey(40)  # 40ms一帧
        if keyboard == 27:
            break

结果:
在这里插入图片描述

通道的分离与合并

cv2.split

分离通道

split(m[, mv]) -> mv

cv2.merge

合并通道

merge(mv[, dst]) -> dst

示例

对RGB通道进行拆分

def channels_split(image):
    """对图片三个通道颜色进行拆分"""
    b, g, r = cv.split(image)  #  拆分 b通道提取时,对该通道颜色保留,其余通道置为0
    # cv.imshow("blue", b)
    # cv.imshow("blue", g)
    # cv.imshow("blue", r)

    changed_image = image.copy()
    changed_image[:, :, 0] = 0  # 将b通道颜色全部置为0
    cv.imshow("changed_image", changed_image)
    image_merge = cv.merge([b, g, r])  #合并
    cv.imshow("image_merge", image_merge)

你可能感兴趣的:(OpenCV,图像处理)