目录
一、色彩空间
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 np
img = np.zeros((480,480,3),np.uint8) # 初始化一个 480*480的图像
def nothing(): # 创建一个函数
pass
cv.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)