文章目录
色彩空间
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有圆锥和圆柱两种定义,参考链接如下:
参考链接:
色彩空间的转换
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)