- 本文简单介绍了几个常见的色彩空间转换;
- 因为HSV应用非常广泛,所以单独介绍其强大的功能;
本文用到的两个原始图像,如下图所示:
目录
一、Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)
(1)GRAY色彩空间
(2)XYZ色彩空间
(3)HSV色彩空间
(4)YCrCb色彩空间
(5)HLS色彩空间
(6)代码实现:
二、利用HSV标记指定的颜色(涉及的三个知识点如下)
(1)通过inRange函数锁定特定
(2)通过基于掩码的按位与显示ROI
(3)显示特定颜色值
(4)综上所述,编写代码如下:
GRAY(灰度图像)通常指 8 位灰度图,其具有 256 个灰度级,像素值的范围是[0,255]。
XYZ 色彩空间是由 CIE(International Commission on Illumination)定义的,是一种更便于计算的色彩空间,它可以与 RGB 色彩空间相互转换。
RGB 是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异,HSV 色彩空间是一种面向视觉感知的颜色模型。HSV 色彩空间从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value), 色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。
人眼视觉系统(HVS,Human Visual System)对颜色的敏感度要低于对亮度的敏感度。在传统的 RGB 色彩空间内,RGB 三原色具有相同的重要性,但是忽略了亮度信息。
在 YCrCb 色彩空间中,Y 代表光源的亮度,色度信息保存在 Cr 和 Cb 中,其中,Cr 表示 红色分量信息,Cb 表示蓝色分量信息。 亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在 RGB 光源中,绿色分量的影响最大,蓝色分量的影响最小。
HLS 色彩空间包含的三要素是色调 H(Hue)、光亮度/明度 L(Lightness)、饱和度 S (Saturation)。 与 HSV 色彩空间类似,只是 HLS 色彩空间用“光亮度/明度 L(lightness)”替换了“亮度 (Value)”。
import cv2
import numpy as np
src = cv2.imread("bulldog.jpg")
src = cv2.resize(src, (int(src.shape[1] / 2), int(src.shape[0] / 2)))
GRAY = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
XYZ = cv2.cvtColor(src, cv2.COLOR_BGR2XYZ)
YCrCb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
HSV = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
HLS = cv2.cvtColor(src, cv2.COLOR_BGR2HLS)
cv2.imshow("src", src)
cv2.imshow("GRAY", GRAY)
cv2.imshow("XYZ", XYZ)
cv2.imshow("YCrCb", YCrCb)
cv2.imshow("HSV", HSV)
cv2.imshow("HLS", HLS)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 中通过函数 cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:
dst = cv2.inRange( src, lowerb, upperb )
式中:
返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间[lowerb,upperb] 内:
正常显示某个图像内的感兴趣区域(ROI),而将其余区域显示为黑色。其语法格式为:
roi=cv2.bitwise_and(img,img, mask= mask)
通过 mask 设置了两个感兴趣区域(掩模)。后续通过在按位与运算中设置掩模的方式,将原始图像 img 内这两部分的值保留显示,而将其余部分的值置零。
各种颜色值的范围为:
首先利用函数 cv2.inRange()查找指定颜色区域,
然后利用基于掩码的按位与运算将指定颜色提取出来。
src = cv2.imread("RGB.jpg")
HSV = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
# 确定蓝色、绿色、红色区域
minBlue = np.array([110, 50, 50])
maxBlue = np.array([130, 255, 255])
minGreen = np.array([50, 50, 50])
maxGreen = np.array([70, 255, 255])
minRed = np.array([0, 50, 50])
maxRed = np.array([30, 255, 255])
# 通过掩码控制的按位与运算,锁定蓝色、绿色、红色区域
mask = cv2.inRange(HSV, minBlue, maxBlue)
blue = cv2.bitwise_and(src, src, mask=mask)
mask = cv2.inRange(HSV, minGreen, maxGreen)
green = cv2.bitwise_and(src, src, mask=mask)
mask = cv2.inRange(HSV, minRed, maxRed)
red = cv2.bitwise_and(src, src, mask=mask)
# 展示各个标记指定的颜色图像
cv2.imshow('blue', blue)
cv2.imshow('green', green)
cv2.imshow('red', red)
cv2.waitKey(0)
cv2.destroyAllWindows()
>>>输出图像,如下图所示:
>>>如有疑问,欢迎评论区一起探讨