1.目标
- 在本教程中,你将学习如何将图像从一个色彩空间转换到另一个,像BGR↔灰色,BGR↔HSV等
- 除此之外,我们还将创建一个应用程序,以提取视频中的彩色对象
- 你将学习以下功能:cv2.cvtColor,**cv2.inRange**等。
2.改变颜色空间
在 OpenCV 中有超过 150 种颜色空间转换的方法。但我们仅需要研究两个最常使用的方法,他们是 BGR 到 Gray,BGR 到 HSV。
我们使用 cv2.cvtColor(input_image, flag)函数进行颜色转换,其中 flag 决定了转换的类型。
对于 BGR 到 Gray 转换我们令 flag 为 **cv2.COLOR_BGR2GRAY**。 同样,对于 BGR 到 HSV, 我们令 flag 为 **cv2.COLOR_BGR2HSV**。
代码:
python
import cv2
image = r'D:\study\EmotionDetection_RealTime-master\data\data\te\01.jpg'
image = cv2.imread(image)
#颜色转换
img1 = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('s',image)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意 对于 HSV, 色调(Hue)范围为 [0,179], 饱和度(Saturation)范围为 [0,255] ,明亮度(Value)为 [0,255]. 不同的软件使用不同的比例. 所以如果你想用 OpenCV 的值与别的软件的值作对比,你需要归一化这些范围。
结果输出:
3.目标颜色区域提取
现在我们知道了如何将 BGR 图片转化为 HSV 图片,我们可以使用它去提取彩色对象。HSV 比 BGR 在颜色空间上更容易表示颜色。在我们的应用中,我们会尝试提取一个感兴趣的彩色对象,方法为:
- 将 BGR 转化为 HSV 颜色空间。
- 点击图像对应区域获得HSV值
- 获取感兴趣的彩色区域
代码:
python
import cv2
import numpy as np
image = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
# image = cv2.imread(image)
import cv2
import numpy as np
from matplotlib import pyplot as plt
image=cv2.imread(image)
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件
print(HSV[y,x])
cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)
lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件
print(HSV[y,x])
您提供的代码片段是使用OpenCV库(通常以
cv2
导入)来处理图像的一部分。这段代码的作用是将图像从BGR颜色空间转换到HSV颜色空间,并且定义了一个鼠标事件处理函数,当用户在图像上左键点击时,它会打印出点击位置像素的HSV值。下面是这段代码的详细解释:
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
:这行代码将输入的image
(应该是BGR格式的numpy数组)转换为HSV颜色空间。OpenCV默认读取图像为BGR格式,而HSV颜色空间对于某些图像处理任务(如颜色分割)更加方便。
def getpos(event,x,y,flags,param):
:这定义了一个名为getpos
的函数,它将作为回调函数用于处理OpenCV窗口中的鼠标事件。这个函数接收五个参数:event
(事件类型),x
和y
(鼠标点击的坐标),flags
(其他参数),param
(用户定义的参数)。
if event==cv2.EVENT_LBUTTONDOWN:
:这行代码检查event
参数是否为cv2.EVENT_LBUTTONDOWN
,即鼠标左键是否被按下。
print(HSV[y,x])
:如果在图像上发生了鼠标左键点击事件,这行代码会打印出鼠标点击位置像素的HSV值。这里HSV[y,x]
访问的是转换到HSV颜色空间后的图像数组,在(x,y)
位置的像素值。
lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)
您提供的代码片段是使用OpenCV库来创建一个蓝色颜色范围的掩码(mask),并将这个掩码显示在窗口中。这段代码是在HSV颜色空间中操作的,这是进行颜色识别和分割的常用方法。
下面是这段代码的详细解释:
lower_blue = np.array([0, 0, 190])
:这行代码定义了蓝色在HSV颜色空间中的低阈值。这里,蓝色的色调(H)从0开始,饱和度(S)从0开始,亮度(V)从190开始。这意味着,亮度高于190的非常浅的蓝色将被排除在外。
upper_blue = np.array([180, 200, 255])
:这行代码定义了蓝色在HSV颜色空间中的高阈值。色调(H)的上限是180(在HSV颜色空间中,蓝色的范围是从0到180,然后再次从180到0,所以这里包括了所有的蓝色),饱和度(S)的上限是200,亮度(V)的上限是255(最大值)。
mask = cv2.inRange(HSV, lower_blue, upper_blue)
:这行代码使用cv2.inRange
函数创建了一个掩码,这个掩码包含了输入图像HSV
中所有在lower_blue
和upper_blue
阈值范围内的像素。在掩码中,这些像素被设置为白色(255),而不在阈值范围内的像素被设置为黑色(0)。
cv2.imshow('mask',mask)
:这行代码显示了创建的掩码。在显示的窗口中,白色的区域代表了图像中蓝色的部分,黑色的区域则代表其他颜色。要使这段代码完整工作,您需要确保已经读取了图像并将其转换为HSV颜色空间,如之前提供的代码示例所示。然后,这段代码将创建并显示蓝色物体的掩码。
提取结果:
这在 stackoverflow.com 中是经常见到的问题。 这个问题非常简单,你可以使用相同的函数:**cv.cvtColor()**。 不需要输入图片,你只需要输入你需要的 BGR 值即可. 例如, 为了找到绿色的 HSV 值, 可以在 Python 终端中输入以下代码:
python
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
现在你可以取 [H-10, 100,100] 和 [H+10, 255, 255] 分别作为上界和下界. 除此之外,你可以使用任何图像编辑工具(如 GIMP)或任何在线转换器来查找这些值,但不要忘记调整 HSV 范围。