目录
一、色彩空间
1.1 RGB色彩空间
1.2 HSV色彩空间
1.3 灰度
1.4 CMYK色彩空间
1.5 Lab色彩空间
二、色彩空间转换
三、识别颜色
3.1 识别一种特定的颜色
3.2 识别多种颜色
一、色彩空间
计算机视觉中常用的色彩空间有RGB色彩空间、HSV色彩空间、CMYK色彩空间、Lab色彩空间等。
1.1 RGB色彩空间
RGB色彩空间是一种常用的计算机视觉颜色表示方法,它使用红(R),绿(G),蓝(B)三个颜色通道来表示所有可见光的颜色。每个通道的取值范围是0到255,代表了相应颜色的强度。通过组合不同强度的三个通道,可以表示出各种各样的颜色。
在RGB色彩空间中,每个像素的颜色可以表示为一个三维向量 (R, G, B),其中R、G、B分别代表红、绿、蓝的强度。通过调整这三个通道的强度,可以产生大量的颜色。
1.2 HSV色彩空间
HSV色彩空间是一种常用于计算机视觉领域的色彩表示方式。HSV代表色相(Hue)、饱和度(Saturation)和明度(Value)。
色相(Hue)表示颜色的种类或者类型。如红色、绿色、蓝色等。色相的取值范围是0到360度,对应了色环上不同的位置。
饱和度(Saturation)表示颜色的纯度或者鲜艳程度。饱和度的取值范围是0到1,0表示灰度(无色彩),1表示最高饱和度(最鲜艳的颜色)。
明度(Value)表示颜色的明亮程度。明度的取值范围也是0到1,0表示最暗的颜色,1表示最亮的颜色。
计算机视觉中常用HSV色彩空间来对图像进行颜色识别、色彩分割等任务。由于HSV色彩空间能够更好地模拟人类感知颜色的方式,因此在一些特定的应用场景中使用HSV色彩空间能够获得更好的效果。
1.3 灰度
灰度空间是指图像的亮度分量,即图像中每个像素的亮度值。灰度空间用于表示图像的黑白信息,常用的灰度空间有灰度图像和灰度直方图。
灰度图像是指每个像素的颜色只有灰度值,没有颜色信息。在计算机中,灰度图像通常使用8位表示,灰度值的范围为0-255,其中0表示黑色,255表示白色。
1.4 CMYK色彩空间
CMYK色彩空间是一种用于打印颜色的色彩空间,由青色(Cyan)、洋红色(Magenta)、黄色(Yellow)和黑色(Key)四个颜色通道组成。每个颜色通道的取值范围是0到100,表示颜色的浓度。
1.5 Lab色彩空间
Lab色彩空间是一种基于人眼感知的色彩空间,由亮度(L)、红绿色度(a)、黄蓝色度(b)三个参数组成。亮度取值范围是0到100,红绿色度和黄蓝色度取值范围是-128到127。Lab色彩空间可以很好地描述人眼对颜色的感知。
二、色彩空间转换
下面我直接代码显示:(有注释)
import cv2
import numpy as np# 将RGB图像转换为灰度图像
def rgb2gray(image):gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)return gray_image# 将RGB图像转换为HSV图像
def rgb2hsv(image):hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)return hsv_image# 将RGB图像转换为LAB图像
def rgb2lab(image):lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)return lab_image# 将RGB图像转换为YCrCb图像
def rgb2ycrcb(image):ycrcb_image = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)return ycrcb_image# 将RGB图像转换为L*a*b*图像
def rgb2labstar(image):labstar_image = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)return labstar_image# 加载RGB图像
image = cv2.imread('image.jpg') //注意换成自己的路径# 将RGB图像转换为灰度图像
gray_image = rgb2gray(image)# 将RGB图像转换为HSV图像
hsv_image = rgb2hsv(image)# 将RGB图像转换为LAB图像
lab_image = rgb2lab(image)# 将RGB图像转换为YCrCb图像
ycrcb_image = rgb2ycrcb(image)# 将RGB图像转换为L*a*b*图像
labstar_image = rgb2labstar(image)# 显示转换后的图像
cv2.imshow('RGB Image', image)
cv2.imshow('Gray Image', gray_image)
cv2.imshow('HSV Image', hsv_image)
cv2.imshow('LAB Image', lab_image)
cv2.imshow('YCrCb Image', ycrcb_image)
cv2.imshow('L*a*b* Image', labstar_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、识别颜色
3.1 识别一种特定的颜色
首先,我们可以通过颜色画板来查看对应颜色的BGR值。
知识拓展:
"""滑条控制BGR
""""""
创建窗口: cv2.namedWindow("windowname")
创建滑条: cv2.createTrackbar("teackbarname","windowname",min,max,onchange)
获取滑条数据: cv2.getTrackbarPos("teackbarname","windowname")windowname: 窗口名trackbarname: 滑条名min: 滑条最小值max: 滑条最大值onchange: 每次滑块更改调用的函数初始化图像:np.zeros((length, width, number), np.uint8)默认初始化后的类型为 float64,后面虽然将其赋值为整数,但其存储类型还是浮点数,因其类型不对从而导致图像不能正常显示length: 图像的长度width: 图像的宽度number: 颜色通道数np.uint8: 使插值算法的结果显示正常np.zeros(shape, dtype = float, order="C")shape: 创建的新数组的形状 (维度)dtype: 创建新数组的数据类型 (默认 float64)order: 可选参数 (C: 代表与C语言类似,行优先; F: 代表列优先)返回值: 给定维度的全零数组"""
创建滑条控制颜色画板:
import cv2 as cv
import numpy as npimg = np.zeros((480,480,3),np.uint8) # 初始化一个 480*480的图像
def nothing(): # 创建一个函数passcv.namedWindow("BGR") # 创建窗口
cv.createTrackbar("R","BGR",0,255,nothing) # 创建滑条
cv.createTrackbar("G","BGR",0,255,nothing)
cv.createTrackbar("B","BGR",0,255,nothing)while(1):r = cv.getTrackbarPos("R","BGR") # 获取滑条数据g = cv.getTrackbarPos("G","BGR")b = cv.getTrackbarPos("B","BGR")print(r,g,b)img[:] = [b,g,r]cv.imshow("BGR",img)cv.waitKey(1)
运行结果:
由图可知: R:39 G:212 B:231
要使用OpenCV识别特定的RGB颜色,完整的示例代码如下:
import cv2
import numpy as np# 定义要识别的颜色范围
lower_red = np.array([35, 212, 230])
upper_red = np.array([45, 212, 232])# 读取图像
img = cv2.imread("D:\Open_CV\OpenCV_demo\Pictures\lanse.png")# 图像缩放 (长,宽)
image = cv2.resize(img,(320,320),interpolation=cv2.INTER_AREA) # 图像缩放 (长,宽)# 将图像从BGR转换为RGB颜色空间
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 创建掩膜
mask = cv2.inRange(image_rgb, lower_red, upper_red)# 显示结果
result = cv2.bitwise_and(image_rgb, image_rgb, mask=mask)# 将图像从RGB转换为BGR颜色空间
result = cv2.cvtColor(result, cv2.COLOR_RGB2BGR)cv2.imshow("Result", result)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
3.2 识别多种颜色
跟上述中识别一种颜色的方法一样,只不过需要加上被识别的颜色范围,多创建几个掩膜和显示窗口。
例如:
- 定义要识别的颜色范围:
# 定义要识别的颜色范围
red_lower = np.array([0, 0, 100], np.uint8)
red_upper = np.array([20, 255, 255], np.uint8)blue_lower = np.array([100, 100, 100], np.uint8)
blue_upper = np.array([140, 255, 255], np.uint8)
- 根据定义的颜色范围,创建掩膜,将图像中的颜色区域标记为白色,其余区域标记为黑色:
red_mask = cv2.inRange(hsv_image, red_lower, red_upper)
blue_mask = cv2.inRange(hsv_image, blue_lower, blue_upper)
- 在原始图像上使用掩膜,只保留颜色区域:
red_result = cv2.bitwise_and(image, image, mask=red_mask)
blue_result = cv2.bitwise_and(image, image, mask=blue_mask)
- 显示结果:
cv2.imshow('Red Result', red_result)
cv2.imshow('Blue Result', blue_result)
cv2.waitKey(0)