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

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 范围。

相关推荐
jay神2 分钟前
基于YOLOv8的传送带异物检测系统
人工智能·python·深度学习·yolo·可视化·计算机毕业设计
强风7944 分钟前
OpenCV基础入门
人工智能·opencv·计算机视觉
小超同学你好4 分钟前
Langgragh 19. Skills 4. SkillToolset 式设计 —— 工具化按需加载的 Skills(含代码示例)
人工智能·语言模型·langchain
人工智能培训5 分钟前
如何衔接知识图谱与图神经网络
人工智能·神经网络·知识图谱
火星资讯8 分钟前
Zenlayer Fabric Port 新加坡首发:城域免费,全球畅连
人工智能·科技
新缸中之脑9 分钟前
20个Nano Banana 2创意工作流
人工智能
智驱力人工智能10 分钟前
馆藏文物预防性保护依赖的图像分析技术 文物损害检测 文物破损检测 文物损害识别误报率优化方案 文物安全巡查AI系统案例 智慧文保AI监测
人工智能·算法·安全·yolo·边缘计算
tobias.b12 分钟前
机器学习 超清晰通俗讲解 + 核心算法全解(深度+易懂版)
人工智能·算法·机器学习
code_pgf13 分钟前
Jetson 上 OpenClaw + Ollama + llama.cpp 的联动配置模板部署大模型
服务器·数据库·人工智能·llama