OpenCV学习(4.1) 改变颜色空间

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**。

代码:

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值
  • 获取感兴趣的彩色区域

代码:

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值。

下面是这段代码的详细解释:

  1. HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV):这行代码将输入的image(应该是BGR格式的numpy数组)转换为HSV颜色空间。OpenCV默认读取图像为BGR格式,而HSV颜色空间对于某些图像处理任务(如颜色分割)更加方便。

  2. def getpos(event,x,y,flags,param)::这定义了一个名为getpos的函数,它将作为回调函数用于处理OpenCV窗口中的鼠标事件。这个函数接收五个参数:event(事件类型),xy(鼠标点击的坐标),flags(其他参数),param(用户定义的参数)。

  3. if event==cv2.EVENT_LBUTTONDOWN::这行代码检查event参数是否为cv2.EVENT_LBUTTONDOWN,即鼠标左键是否被按下。

  4. 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颜色空间中操作的,这是进行颜色识别和分割的常用方法。

下面是这段代码的详细解释:

  1. lower_blue = np.array([0, 0, 190]):这行代码定义了蓝色在HSV颜色空间中的低阈值。这里,蓝色的色调(H)从0开始,饱和度(S)从0开始,亮度(V)从190开始。这意味着,亮度高于190的非常浅的蓝色将被排除在外。

  2. upper_blue = np.array([180, 200, 255]):这行代码定义了蓝色在HSV颜色空间中的高阈值。色调(H)的上限是180(在HSV颜色空间中,蓝色的范围是从0到180,然后再次从180到0,所以这里包括了所有的蓝色),饱和度(S)的上限是200,亮度(V)的上限是255(最大值)。

  3. mask = cv2.inRange(HSV, lower_blue, upper_blue):这行代码使用cv2.inRange函数创建了一个掩码,这个掩码包含了输入图像HSV中所有在lower_blueupper_blue阈值范围内的像素。在掩码中,这些像素被设置为白色(255),而不在阈值范围内的像素被设置为黑色(0)。

  4. cv2.imshow('mask',mask):这行代码显示了创建的掩码。在显示的窗口中,白色的区域代表了图像中蓝色的部分,黑色的区域则代表其他颜色。

要使这段代码完整工作,您需要确保已经读取了图像并将其转换为HSV颜色空间,如之前提供的代码示例所示。然后,这段代码将创建并显示蓝色物体的掩码。

提取结果:

 这在 stackoverflow.com 中是经常见到的问题。 这个问题非常简单,你可以使用相同的函数:**cv.cvtColor()**。 不需要输入图片,你只需要输入你需要的 BGR 值即可. 例如, 为了找到绿色的 HSV 值, 可以在 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 范围。 

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值