opencv-颜色通道

1. 颜色空间

1.1 HSV颜色空间

        HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。在HSV模型中,颜色是由色相(Hue),饱和度(Saturation),明度(Value)共同组成。

如图所示,在HSV模型中

  • 色相(色彩)(Hue)使用角度度量的,范围是从0 °到360 °(逆时针旋转),比如0 ° / 360 ° 代表红色,120 °代表原谅色,240 °代表蓝色。

  • 饱和度(Saturation)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

  • 明度(Value)颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关。对于物体色,此值和物体的透射比或反射比有关。通常其取值范围是0%(黑)到100%(白)(在计算机视觉库中为0 - 255)。

1.2 HSL颜色空间

        HSL颜色空间和HSV颜色空间非常类似。‌HSL‌(Hue, Saturation, Lightness)是一种颜色模型,用于描述颜色。HSL模型通过色相(Hue)、饱和度(Saturation)和亮度(Lightness)三个参数来定义颜色。

HSL在顶部是纯白的, 不管是什么颜色. 

  • 色相(色彩)(Hue)使用角度度量的,范围是从0 °到360 °(逆时针旋转),比如0 ° / 360 ° 代表红色,120 °代表原谅色,240 °代表蓝色。(和HSV一样)

  • 饱和度(Saturation)指颜色的强度或纯度,使用 0% ~ 100% 的百分比来度量。
    表示色相中颜色成分所占的比例,数值越大,颜色中的灰色越少,颜色越鲜艳,呈现的是一种从灰色到色相颜色的变化。

  • 亮度(Lightness)表现颜色的明暗程度,使用 0 ~ 100% 的百分比来度量。
    反映色彩中混入的黑白两色,50% 处只有纯色,小于 50% 时,数值越小混入的黑色越多,越接近于黑色;大于 50% 时,数值越大混入的白色越多,越接近于白色。
    L最大时必为白色,L最小时必为黑色。体现的是从黑色到色相(H)选择颜色再到白色的过渡。

1.3 YUV颜色空间

        YUV模型包括三个分量:Y(亮度)、U(蓝色色差)、V(红色色差)。通过分离亮度和色度信息,YUV模型在图像压缩和传输中发挥了重要作用。

Y (Luminance, 亮度分量):亮度分量 Y 表示图像的灰度级别。Y 的值决定了图像的明暗程度,与颜色无关。Y 的范围通常为 0 到 255(8 位色深),0 表示黑色,255 表示白色。

U 和 V (Chrominance, 色度分量):U 和 V 是色度分量,分别表示色彩的蓝色色差和红色色差。它们包含了图像的颜色信息。U 分量表示颜色中的蓝色与亮度的差异(通常为蓝色色差)。V 分量表示颜色中的红色与亮度的差异(通常为红色色差)。
U 和 V 的范围通常为 -128 到 +128(8 位有符号整数),其中 0 表示没有色偏。Y’UV的发明是由于彩色电视与黑白电视的过渡时期。Y’UV最大的优点在于只需占用极少的带宽。

1.4 获取一幅图片有多少种颜色

import cv2
from pandas import DataFrame

car = cv2.imread("car.jpg")
car = cv2.resize(car,(880,640),interpolation=cv2.INTER_CUBIC)
cv2.imshow("car", car)
# 用每一个像素创造dataframe
df = DataFrame(car.reshape(-1,3))
df.head()
df_dup = df.duplicated()
print(df_dup.sum())
if cv2.waitKey(0) == ord('q'):
    cv2.destroyAllWindows()

2. 色彩空间的转换

        在 OpenCV 中,cv2.COLOR_ 用于表示颜色空间转换的常量。这些常量定义了不同的颜色空间转换代码,可以在图像处理中使用。以下是一些常用的 cv2.COLOR_ 常量:

cv2.COLOR_BGR2GRAY:将 BGR 彩色图像转换为灰度图像。
cv2.COLOR_BGR2RGB:将 BGR 彩色图像转换为 RGB 彩色图像。
cv2.COLOR_BGR2HSV:将 BGR 彩色图像转换为 HSV 颜色空间。
cv2.COLOR_BGR2Lab:将 BGR 彩色图像转换为 Lab 颜色空间。
cv2.COLOR_RGB2GRAY:将 RGB 彩色图像转换为灰度图像。
cv2.COLOR_RGB2BGR:将 RGB 彩色图像转换为 BGR 彩色图像。
cv2.COLOR_RGB2HSV:将 RGB 彩色图像转换为 HSV 颜色空间。
cv2.COLOR_RGB2Lab:将 RGB 彩色图像转换为 Lab 颜色空间。
cv2.COLOR_GRAY2BGR:将灰度图像转换为 BGR 彩色图像。
cv2.COLOR_GRAY2RGB:将灰度图像转换为 RGB 彩色图像。
cv2.COLOR_HSV2BGR:将 HSV 颜色空间图像转换为 BGR 彩色图像。
cv2.COLOR_HSV2RGB:将 HSV 颜色空间图像转换为 RGB 彩色图像。

2.1 RGB转GRAY

2.1.1 转换代码

        当使用 OpenCV 中的 cv2.COLOR_BGR2GRAY 将彩色图像转换为灰度图像时,可以使用以下代码:

import cv2
# 读取彩色图像
img = cv2.imread('car.jpg')
# 将彩色图像转换为灰度图像
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

 2.1.1 转换原理

        当使用 cv2.COLOR_BGR2GRAY 将彩色图像转换为灰度图像时,它基于亮度感知的原理进行转换。灰度图像是一种单通道图像,每个像素的数值代表了该像素的亮度值,而不包含颜色信息。在转换过程中,使用了以下数学公式来计算每个像素的灰度值:

\text{Gray} = 0.299 \times R + 0.587 \times G + 0.114 \times B
这个公式基于人眼对不同颜色的感知权重,因为人眼对绿色的感知更敏感,对红色和蓝色的感知较低。具体步骤如下:

  1. 读取彩色图像。
  2. 对图像的每个像素进行遍历。
  3. 对于每个像素,根据上述公式计算灰度值。
  4. 将计算得到的灰度值赋给灰度图像对应位置的像素。
  5. 最终得到的灰度图像包含了图像的亮度信息,而去除了颜色信息。

这样,通过 cv2.COLOR_BGR2GRAY,你可以将彩色图像转换为灰度图像,并且可以更专注于图像的亮度特征。

2.2 BGR转RGB

2.2.1 转换代码

        以下是使用 OpenCV 将图像从 BGR 格式转换为 RGB 格式的示例代码:

import cv2
# 读取图像
img = cv2.imread('car.jpg')
# 将图像从 BGR 格式转换为 RGB 格式
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 显示原始图像和转换后的图像
cv2.imshow('Image', img_rgb)
cv2.imshow('RGB_Image', img_rgb )
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

2.2.2 转换原理

        在 OpenCV 中,BGR(蓝绿红)和 RGB(红绿蓝)是两种常用的图像表示方式。BGR 是 OpenCV 默认的图像格式,而 RGB 是人们通常更熟悉和常用的图像格式。
在 BGR 到 RGB 的转换中,每个像素的颜色通道的顺序会发生改变,即将原始图像中的蓝色通道B l u e BlueBlue和红色通道R e d RedRed进行互换,保持绿色通道G r e e n GreenGreen不变。这样就可以将图像从 BGR 格式转换为 RGB 格式。
转换的数学公式如下:

R\_new = B,G\_new = G,B\_new = R
        其中,R\_new = B,G\_new = G,B\_new = R分别表示转换后的 RGB 图像中的红色、绿色和蓝色通道的像素值。通过这种转换,我们可以更方便地处理 RGB 格式的图像,因为 RGB 格式更符合人类感知和常用的颜色表示方式。

2.3 BGR转HSV

2.3.1 转换代码

        当将 BGR 图像转换为 HSV 图像时,需要使用 OpenCV 的 cv2.cvtColor() 函数,并将转换代码设置为 cv2.COLOR_BGR2HSV。下面是更详细的代码示例:

import cv2
# 读取图像
img= cv2.imread('car.jpg')
# 将 BGR 图像转换为 HSV 图像
hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 显示原始图像和转换后的图像
cv2.imshow('BGR_Image', img)
cv2.imshow('HSV_Image', hsv_image)
if cv2.waitKey(0) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

2.3.2 转换原理

HSV(色调、饱和度、亮度)是一种颜色空间,通过以下数学公式将BGR(蓝、绿、红)颜色空间转换为HSV颜色空间:
1、归一化RGB值:将BGR图像的每个通道的像素值除以255,使得每个通道的取值范围在[0, 1]之间。

R' = \frac{R}{255}, \quad G' = \frac{G}{255}, \quad B' = \frac{B}{255}

2、计算最大值和最小值:找到归一化RGB值中的最大值Max和最小值Min。

Max = \max(R', G', B'), \quad Min = \min(R', G', B')

3、计算色调(H):

如果Max = Min,则色调H=0

如果Max = R',且G' \geq B',则色调H = \frac{60 \times (G' - B')}{Max - Min} + 0

如果Max = R',且G' < B',则色调H = \frac{60 \times (G' - B')}{Max - Min} + 360

如果Max = G',则色调H = \frac{60 \times (B' - R')}{Max - Min} + 120

如果Max = B',则色调H = \frac{60 \times (R' - G')}{Max - Min} + 240

4、计算饱和度(S):

如果Max=0,则饱和度S = 0
如果M a x ! = 0,则饱和度S = \frac{Max - Min}{Max}
这里的饱和度S的取值范围是[0, 1]。

5、计算亮度(V):亮度V为Max。
这里的亮度V的取值范围是[0, 1]。
通过这些公式,可以将BGR颜色空间中的像素值转换为HSV颜色空间中的色调、饱和度和亮度值。这样就完成了从BGR到HSV的颜色空间转换。

2.4 通过trarckbar制作简单颜色空间转化器

import cv2

def callback(value):
    pass

cv2.namedWindow('color', cv2.WINDOW_NORMAL)
cv2.resizeWindow('color', 640, 480)
img = cv2.imread("car.jpg")
color_spaces = [cv2.COLOR_BGR2RGB, cv2.COLOR_BGR2BGRA,
               cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV,
               cv2.COLOR_BGR2YUV]
cv2.createTrackbar('curcolor','color',0,4,callback)
while True:
    # 获取trarckbar的值
    index = cv2.getTrackbarPos('curcolor','color')
    # 进行颜色空间转化
    cvt_img = cv2.cvtColor(img, color_spaces[index])
    cv2.imshow('color', cvt_img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

展示图如下: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值