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 将彩色图像转换为灰度图像时,它基于亮度感知的原理进行转换。灰度图像是一种单通道图像,每个像素的数值代表了该像素的亮度值,而不包含颜色信息。在转换过程中,使用了以下数学公式来计算每个像素的灰度值:
这个公式基于人眼对不同颜色的感知权重,因为人眼对绿色的感知更敏感,对红色和蓝色的感知较低。具体步骤如下:
- 读取彩色图像。
- 对图像的每个像素进行遍历。
- 对于每个像素,根据上述公式计算灰度值。
- 将计算得到的灰度值赋给灰度图像对应位置的像素。
- 最终得到的灰度图像包含了图像的亮度信息,而去除了颜色信息。
这样,通过 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 格式。
转换的数学公式如下:
其中,分别表示转换后的 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]之间。
2、计算最大值和最小值:找到归一化RGB值中的最大值Max和最小值Min。
3、计算色调(H):
如果,则色调
。
如果
,且
,则色调
如果
,且
,则色调
如果,则色调
如果,则色调
4、计算饱和度(S):
如果,则饱和度
。
如果,则饱和度
。
这里的饱和度S的取值范围是[0, 1]。
5、计算亮度(V):亮度V为Max。
这里的亮度的取值范围是[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()
展示图如下: