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

代码:

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(HSVy,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 终端中输入以下代码:

python 复制代码
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]

现在你可以取 H-10, 100,100H+10, 255, 255 分别作为上界和下界. 除此之外,你可以使用任何图像编辑工具(如 GIMP)或任何在线转换器来查找这些值,但不要忘记调整 HSV 范围。

相关推荐
米小虾2 小时前
告别单打独斗:2026年多Agent协作架构实战指南
人工智能·agent
IT_陈寒3 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
Larcher3 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
牧艺3 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
CodePlayer竟然被占用了4 小时前
Codex 用电脑的三种姿势:选错模式,你就白烧 Token
人工智能
袋鼠云数栈UED团队5 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
Awu12275 小时前
⚡从零开发 Agent CLI(二):CLI 框架搭建与子命令路由
人工智能·aigc
码上天下5 小时前
React Query 缓存 AI 对话历史的几个权衡
人工智能