Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色

  • 本文简单介绍了几个常见的色彩空间转换;
  • 因为HSV应用非常广泛,所以单独介绍其强大的功能;

本文用到的两个原始图像,如下图所示:

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第1张图片

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第2张图片

目录

一、Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)

(1)GRAY色彩空间

(2)XYZ色彩空间

(3)HSV色彩空间

(4)YCrCb色彩空间

(5)HLS色彩空间

 (6)代码实现:

二、利用HSV标记指定的颜色(涉及的三个知识点如下)

(1)通过inRange函数锁定特定

(2)通过基于掩码的按位与显示ROI

(3)显示特定颜色值

(4)综上所述,编写代码如下: 


一、Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)

(1)GRAY色彩空间

GRAY(灰度图像)通常指 8 位灰度图,其具有 256 个灰度级,像素值的范围是[0,255]。 

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第3张图片

(2)XYZ色彩空间

XYZ 色彩空间是由 CIE(International Commission on Illumination)定义的,是一种更便于计算的色彩空间,它可以与 RGB 色彩空间相互转换。

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第4张图片

(3)HSV色彩空间

RGB 是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定的差异,HSV 色彩空间是一种面向视觉感知的颜色模型。HSV 色彩空间从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value), 色调指光的颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。​​​​​​​

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第5张图片

(4)YCrCb色彩空间

人眼视觉系统(HVS,Human Visual System)对颜色的敏感度要低于对亮度的敏感度。在传统的 RGB 色彩空间内,RGB 三原色具有相同的重要性,但是忽略了亮度信息。

在 YCrCb 色彩空间中,Y 代表光源的亮度,色度信息保存在 Cr 和 Cb 中,其中,Cr 表示 红色分量信息,Cb 表示蓝色分量信息。 亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在 RGB 光源中,绿色分量的影响最大,蓝色分量的影响最小。

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第6张图片

(5)HLS色彩空间

HLS 色彩空间包含的三要素是色调 H(Hue)、光亮度/明度 L(Lightness)、饱和度 S (Saturation)。 与 HSV 色彩空间类似,只是 HLS 色彩空间用“光亮度/明度 L(lightness)”替换了“亮度 (Value)”。

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第7张图片

 (6)代码实现:

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()

二、利用HSV标记指定的颜色(涉及的三个知识点如下)

(1)通过inRange函数锁定特定

OpenCV 中通过函数 cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:

dst = cv2.inRange( src, lowerb, upperb )

式中:

  • dst 表示输出结果,大小和 src 一致。
  • src 表示要检查的数组或图像。
  • lowerb 表示范围下界。
  • upperb 表示范围上界。

返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间[lowerb,upperb] 内:

  • 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
  • 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。

(2)通过基于掩码的按位与显示ROI

正常显示某个图像内的感兴趣区域(ROI),而将其余区域显示为黑色。其语法格式为:

roi=cv2.bitwise_and(img,img, mask= mask)

通过 mask 设置了两个感兴趣区域(掩模)。后续通过在按位与运算中设置掩模的方式,将原始图像 img 内这两部分的值保留显示,而将其余部分的值置零。

(3)显示特定颜色值

各种颜色值的范围为:

  • 蓝色:值分布在[110,100,100]和[130,255,255]之间。
  • 绿色:值分布在[50,100,100]和[70,255,255]之间。
  • 红色:值分布在[0,100,100]和[10,255,255]之间。

(4)综上所述,编写代码如下:

首先利用函数 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()

  >>>输出图像,如下图所示:

Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第8张图片

 Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第9张图片

 Opencv色彩空间(GRAY、XYZ、HSV、YCrCb、HLS)展示,以及利用HSV标记指定的颜色_第10张图片

   >>>如有疑问,欢迎评论区一起探讨

你可能感兴趣的:(opencv_python,opencv,python,计算机视觉,图像处理)