图像的色彩转换
这篇教学会介绍使用 OpenCV 的 cvtcolor() 方法,将图像的色彩模型从 RGB 转换为灰阶、HLS、HSV...等。
快速导览:
因为程序中的 OpenCV 会需要使用镜头或 GPU,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda ) ,并安装 OpenCV 函数库 ( 参考:OpenCV 函数库 )。
色彩模型是什么?
色彩模型 ( Color model ) 是一种以数字来表示色彩的数学模型,例如在 RGB 的色彩模型里,以 (255,0,0) 表示红色,但在 HSV 的色彩模型中,红色则是以 (0,100,100) 来表示,用的色彩模型有:
RGB ( 红、绿、蓝 )
RGB 颜色模型也称做三原色光模型,是一种“加色”模型,将红 ( Red )、绿 ( Green )、蓝 ( Blue ) 三原色的色光以不同的比例相加,混合产生各种色彩的光线,通常表现方式会使用 (255,255,255) 或十六进制 FFFFFF 来表现 ( 参考:三原色光模式 )。
RGBA ( 红、绿、蓝、alpha )
RGBA 颜色模型由 RGB 色彩模型和 Alpha 通道组成。RGBA 代表红 ( Red )、绿 ( Green )、蓝 ( Blue ) 和 Alpha 通道,alpha 通道为图像的不透明度参数,数值可以用百分比、整数或者使用 0 到 1 的实数表示。例如,若一个像素的 Alpha 通道数值为0% 表示完全透明的,无法被看见,如果数值为 100% 则是完全不透明 ( 参考:RGBA )。
HSV ( 色相、饱和度、明度 )、HSL ( 色相、饱和度、亮度 )
HSL 和 HSV 颜色模型都是一种将 RGB 色彩模型中的点,转变在圆柱坐标系中的表示法。HSL 是色相、饱和度、亮度 ( Hue、Saturation、Lightness ),HSV 是色相、饱和度、明度 ( Hue、Saturation、Value ),又称 HSB ( Brightness )。
HSL 和 HSV 模型都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”、“色调”或“明度” ( 参考:HSL 和 HSV 色彩空间 )。
GRAY ( 灰阶 )
灰阶是每个像素只有最暗黑色到最亮的白色的灰阶,灰阶图像在黑色与白色之间还有许多级的颜色深度,用于显示的灰阶图像,通常用每个采样像素 8bits 的非线性尺度,内容可以包含 256 种灰阶 ( 8bits 表示 2 的 8 次方 = 256 )。
cvtcolor() 色彩转换
使用 OpenCV 的 cvtcolor() 方法,可以将转换图像色彩,使用方法如下:
cv2.cvtColor(img, code)
# img 來源影像
# code 要轉換的色彩空間名稱
常用的色彩空间代码如下 ( 完整参考:ColorConversionCodes ):
| 代码 | 说明 |
|---|---|
| cv2.COLOR_BGR2BGRA | RGB 转 RGBA。 |
| cv2.COLOR_BGRA2BGR | RGBA 转 RGB。 |
| cv2.COLOR_BGR2GRAY | RGB 转灰阶。 |
| cv2.COLOR_BGR2HSV | RGB 转 HSV。 |
| cv2.COLOR_RGB2HLS | RGB 转 RSL。 |
下方的程序码执行后,会将来源的彩色图片,转换成灰阶图像。
import cv2
img = cv2.imread('meme.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉換成灰階影像
cv2.imwrite('oxxo', img)
cv2.waitKey(0) # 按下任意鍵停止
cv2.destroyAllWindows()
下方的程序码执行后,会将来源的彩色影片,转换成灰阶影片。
import cv2
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Cannot receive frame")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 轉換成灰階影像
cv2.imshow('oxxostudio', gray)
if cv2.waitKey(1) == ord('q'):
break # 按下 q 鍵停止
cap.release()
cv2.destroyAllWindows()
微信扫码关注
抖音扫码关注