0. 颜色模式
- RGB 模式(百万种颜色)
- CMYK 模式(四种印刷色)
- 索引模式(256 种颜色)
- 灰度模式(256 级灰度)
- 位图模式(两种颜色)
0.1 灰度模式
也就是灰度图(黑白照片),每个像素只有明暗变化,用0~255共256个亮度级来表示,用8个bit来表示,所以每个像素信息用8bit储存.
0.2 位图模式(二值图像)
即只有纯黑和纯白两种亮度,没有渐变的亮度级,通常用0表示纯黑,1表示纯白,所以每个像素信息用1bit表示即可
0.3 RGB模式:基于发光体(电子产品)的色彩模式
即用RGB三原色表示所种颜色,每个像素储存RGB三个分量的亮度,一个像素储存需要8bit*3=24bit(当然如果有更高要求,则会超过24bit,因为一个亮度等级可能不止0~255,需要超过8bit来表示),常见的24bit色彩大概是1678万种,也就是常见的1600万真彩色。
依次为:
- 1 RGB 模式(百万种颜色)
- 2 CMYK 模式(四种印刷色)
- 3 索引模式(256 种颜色)
- 4 灰度模式(256 级灰度)
- 5 位图模式(两种颜色)
CMYK模式:基于印刷的色彩模式
cyan(青色),magenta(洋红),yellow(黄色),black(黑色)
CMYK与RGB的区别在于RGB想要某种颜色,RGB分量任意混合即可;但是CMYK作为印刷多次叠加颜色变深(这样更适合印刷)。
0.4 Lab模式:
- L*代表亮度
- a*代表从绿色到红色的分量
- b*代表从蓝色到黄色的分量
基于人对颜色的感觉来设计的,感知均匀:Lab分量变化幅度和人眼感受的颜色变化幅度一样。该模式也容易调整:想要调整亮度,只需要调节亮度分量L,调节色彩就分别调整a和b分量
4.6 HSL(HSV)色彩模式
即色相(0-180)、饱和度(0-255)、亮度(0-255)
(Hue,Saturation,Lightness)
更符合人眼对颜色的识别,一眼观察颜色首先分辨出色相,同时色相、饱和度、亮度三个数据也容易想象出具体颜色,而RGB三个数据不能直观想象出
- 对于HSV分量用归一化表示的话,H色相分量使用红色开始(红-黄-绿方向)到红色结束,那么归一化H=0.67大概表示蓝色色色相,实际H=0.6*180=120
- S分量表示饱和度,当S=0时表示白色,当S=255,表示饱和度很高
- V分量表示亮度,当V=0时表示黑色,当V=255,表示亮度很高
- 所以我们表示蓝色范围可以定义(110,50,50)-(130,255,255)
4.7 索引图
索引图像包含一个数据矩阵data和一个调色板矩阵map,数据矩阵可以使uint8,uint16或双精度类型,而调色板矩阵则总是一个m*3的双精度矩阵,当图像转换成索引模式时,系统自动归纳包含大多数的256种颜色表。主要用于网络发布,例如双方标准化map颜色索引图,只需要传输uint8的数据矩阵,接收方显示时解析即可。
1. 颜色空间的转换
opencv包含了大量的颜色空间转换方法,但是最常用的就是BGR–Gray和BGR–HSV两种
- cv2.cvtColor(input_image,flag):flag指定转换类型:
flag | 类型 |
---|---|
cv2.COLOR_BGR2GRAY | BGR转Gray |
cv2.COLOR_BGR2HSV | BGR转HSV |
扩展:
cv2.COLOR_BGR2BGRA
cv2.COLOR_RGB2RGBA
cv2.COLOR_BGRA2BGR
cv2.COLOR_RGBA2RGB
cv2.COLOR_BGR2RGBA
cv2.COLOR_RGB2BGRA
cv2.COLOR_RGBA2BGR
cv2.COLOR_BGRA2RGB
cv2.COLOR_BGR2RGB
cv2.COLOR_RGB2BGR
cv2.COLOR_BGRA2RGBA
cv2.COLOR_RGBA2BGRA
cv2.COLOR_BGR2GRAY
cv2.COLOR_RGB2GRAY
cv2.COLOR_GRAY2BGR
cv2.COLOR_GRAY2RGB
cv2.COLOR_GRAY2BGRA
cv2.COLOR_GRAY2RGBA
cv2.COLOR_BGRA2GRAY
cv2.COLOR_RGBA2GRAY
cv2.COLOR_BGR2BGR565
cv2.COLOR_RGB2BGR565
cv2.COLOR_BGR5652BGR
cv2.COLOR_BGR5652RGB
cv2.COLOR_BGRA2BGR565
cv2.COLOR_RGBA2BGR565
cv2.COLOR_BGR5652BGRA
cv2.COLOR_BGR5652RGBA
cv2.COLOR_GRAY2BGR565
cv2.COLOR_BGR5652GRAY
cv2.COLOR_BGR2BGR555
cv2.COLOR_RGB2BGR555
cv2.COLOR_BGR5552BGR
cv2.COLOR_BGR5552RGB
cv2.COLOR_BGRA2BGR555
cv2.COLOR_RGBA2BGR555
cv2.COLOR_BGR5552BGRA
cv2.COLOR_BGR5552RGBA
cv2.COLOR_GRAY2BGR555
cv2.COLOR_BGR5552GRAY
cv2.COLOR_BGR2XYZ
cv2.COLOR_RGB2XYZ
cv2.COLOR_XYZ2BGR
cv2.COLOR_XYZ2RGB
cv2.COLOR_BGR2YCrCb
cv2.COLOR_RGB2YCrCb
cv2.COLOR_YCrCb2BGR
cv2.COLOR_YCrCb2RGB
cv2.COLOR_BGR2HSV
cv2.COLOR_RGB2HSV
cv2.COLOR_BGR2Lab
cv2.COLOR_RGB2Lab
cv2.COLOR_BGR2Luv
cv2.COLOR_RGB2Luv
cv2.COLOR_BGR2HLS
cv2.COLOR_RGB2HLS
cv2.COLOR_HSV2BGR
cv2.COLOR_HSV2RGB
cv2.COLOR_Lab2BGR
cv2.COLOR_Lab2RGB
cv2.COLOR_Luv2BGR
cv2.COLOR_Luv2RGB
cv2.COLOR_HLS2BGR
cv2.COLOR_HLS2RGB
cv2.COLOR_BGR2HSV_FULL
cv2.COLOR_RGB2HSV_FULL
cv2.COLOR_BGR2HLS_FULL
cv2.COLOR_RGB2HLS_FULL
cv2.COLOR_HSV2BGR_FULL
cv2.COLOR_HSV2RGB_FULL
cv2.COLOR_HLS2BGR_FULL
cv2.COLOR_HLS2RGB_FULL
cv2.COLOR_LBGR2Lab
cv2.COLOR_LRGB2Lab
cv2.COLOR_LBGR2Luv
cv2.COLOR_LRGB2Luv
cv2.COLOR_Lab2LBGR
cv2.COLOR_Lab2LRGB
cv2.COLOR_Luv2LBGR
cv2.COLOR_Luv2LRGB
cv2.COLOR_BGR2YUV
cv2.COLOR_RGB2YUV
cv2.COLOR_YUV2BGR
cv2.COLOR_YUV2RGB
cv2.COLOR_YUV2RGB_NV12
cv2.COLOR_YUV2BGR_NV12
cv2.COLOR_YUV2RGB_NV21
cv2.COLOR_YUV2BGR_NV21
cv2.COLOR_YUV420sp2RGB
cv2.COLOR_YUV420sp2BGR
cv2.COLOR_YUV2RGBA_NV12
cv2.COLOR_YUV2BGRA_NV12
cv2.COLOR_YUV2RGBA_NV21
cv2.COLOR_YUV2BGRA_NV21
cv2.COLOR_YUV420sp2RGBA
cv2.COLOR_YUV420sp2BGRA
cv2.COLOR_YUV2RGB_YV12
cv2.COLOR_YUV2BGR_YV12
cv2.COLOR_YUV2RGB_IYUV
cv2.COLOR_YUV2BGR_IYUV
cv2.COLOR_YUV2RGB_I420
cv2.COLOR_YUV2BGR_I420
cv2.COLOR_YUV420p2RGB
cv2.COLOR_YUV420p2BGR
cv2.COLOR_YUV2RGBA_YV12
cv2.COLOR_YUV2BGRA_YV12
cv2.COLOR_YUV2RGBA_IYUV
cv2.COLOR_YUV2BGRA_IYUV
cv2.COLOR_YUV2RGBA_I420
cv2.COLOR_YUV2BGRA_I420
cv2.COLOR_YUV420p2RGBA
cv2.COLOR_YUV420p2BGRA
cv2.COLOR_YUV2GRAY_420
cv2.COLOR_YUV2GRAY_NV21
cv2.COLOR_YUV2GRAY_NV12
cv2.COLOR_YUV2GRAY_YV12
cv2.COLOR_YUV2GRAY_IYUV
cv2.COLOR_YUV2GRAY_I420
cv2.COLOR_YUV420sp2GRAY
cv2.COLOR_YUV420p2GRAY
cv2.COLOR_YUV2RGB_UYVY
cv2.COLOR_YUV2BGR_UYVY
cv2.COLOR_YUV2RGB_Y422
cv2.COLOR_YUV2BGR_Y422
cv2.COLOR_YUV2RGB_UYNV
cv2.COLOR_YUV2BGR_UYNV
cv2.COLOR_YUV2RGBA_UYVY
cv2.COLOR_YUV2BGRA_UYVY
cv2.COLOR_YUV2RGBA_Y422
cv2.COLOR_YUV2BGRA_Y422
cv2.COLOR_YUV2RGBA_UYNV
cv2.COLOR_YUV2BGRA_UYNV
cv2.COLOR_YUV2RGB_YUY2
cv2.COLOR_YUV2BGR_YUY2
cv2.COLOR_YUV2RGB_YVYU
cv2.COLOR_YUV2BGR_YVYU
cv2.COLOR_YUV2RGB_YUYV
cv2.COLOR_YUV2BGR_YUYV
cv2.COLOR_YUV2RGB_YUNV
cv2.COLOR_YUV2BGR_YUNV
cv2.COLOR_YUV2RGBA_YUY2
cv2.COLOR_YUV2BGRA_YUY2
cv2.COLOR_YUV2RGBA_YVYU
cv2.COLOR_YUV2BGRA_YVYU
cv2.COLOR_YUV2RGBA_YUYV
cv2.COLOR_YUV2BGRA_YUYV
cv2.COLOR_YUV2RGBA_YUNV
cv2.COLOR_YUV2BGRA_YUNV
cv2.COLOR_YUV2GRAY_UYVY
cv2.COLOR_YUV2GRAY_YUY2
cv2.COLOR_YUV2GRAY_Y422
cv2.COLOR_YUV2GRAY_UYNV
cv2.COLOR_YUV2GRAY_YVYU
cv2.COLOR_YUV2GRAY_YUYV
cv2.COLOR_YUV2GRAY_YUNV
cv2.COLOR_RGBA2mRGBA
cv2.COLOR_mRGBA2RGBA
cv2.COLOR_RGB2YUV_I420
cv2.COLOR_BGR2YUV_I420
cv2.COLOR_RGB2YUV_IYUV
cv2.COLOR_BGR2YUV_IYUV
cv2.COLOR_RGBA2YUV_I420
cv2.COLOR_BGRA2YUV_I420
cv2.COLOR_RGBA2YUV_IYUV
cv2.COLOR_BGRA2YUV_IYUV
cv2.COLOR_RGB2YUV_YV12
cv2.COLOR_BGR2YUV_YV12
cv2.COLOR_RGBA2YUV_YV12
cv2.COLOR_BGRA2YUV_YV12
cv2.COLOR_BayerBG2BGR
cv2.COLOR_BayerGB2BGR
cv2.COLOR_BayerRG2BGR
cv2.COLOR_BayerGR2BGR
cv2.COLOR_BayerBG2RGB
cv2.COLOR_BayerGB2RGB
cv2.COLOR_BayerRG2RGB
cv2.COLOR_BayerGR2RGB
cv2.COLOR_BayerBG2GRAY
cv2.COLOR_BayerGB2GRAY
cv2.COLOR_BayerRG2GRAY
cv2.COLOR_BayerGR2GRAY
cv2.COLOR_BayerBG2BGR_VNG
cv2.COLOR_BayerGB2BGR_VNG
cv2.COLOR_BayerRG2BGR_VNG
cv2.COLOR_BayerGR2BGR_VNG
cv2.COLOR_BayerBG2RGB_VNG
cv2.COLOR_BayerGB2RGB_VNG
cv2.COLOR_BayerRG2RGB_VNG
cv2.COLOR_BayerGR2RGB_VNG
cv2.COLOR_BayerBG2BGR_EA
cv2.COLOR_BayerGB2BGR_EA
cv2.COLOR_BayerRG2BGR_EA
cv2.COLOR_BayerGR2BGR_EA
cv2.COLOR_BayerBG2RGB_EA
cv2.COLOR_BayerGB2RGB_EA
cv2.COLOR_BayerRG2RGB_EA
cv2.COLOR_BayerGR2RGB_EA
cv2.COLOR_BayerBG2BGRA
cv2.COLOR_BayerGB2BGRA
cv2.COLOR_BayerRG2BGRA
cv2.COLOR_BayerGR2BGRA
cv2.COLOR_BayerBG2RGBA
cv2.COLOR_BayerGB2RGBA
cv2.COLOR_BayerRG2RGBA
cv2.COLOR_BayerGR2RGBA
cv2.COLOR_COLORCVT_MAX
2. 利用颜色来追踪某物体
比如我们使用摄像头检测某个蓝色的物体:
- 获取帧图像
- 将图像转换到HSV空间
- 设置HSV阈值到蓝色范围
为什么不直接用RGB呢?因为即使是一切浅红色前绿色都会有蓝色分量,所以其实我们不好再BGR空间定义蓝色,如果将绿色红色分量定义为0,只设置蓝色分量,其实这样的蓝色更接近纯蓝色,限制了实际蓝色的范围。
给出常见颜色的HSV最值范围:
具体实现参考:opencv-python掩膜操作(进阶篇之颜色追踪)
需要用到opencv掩膜操作和HSV颜色空间两个知识点