前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv(4.5.3)-python(十)--改变色彩空间

opencv(4.5.3)-python(十)--改变色彩空间

作者头像
用户9875047
发布2022-12-07 10:13:59
4580
发布2022-12-07 10:13:59
举报
文章被收录于专栏:机器视觉全栈er机器视觉全栈er

翻译及二次校对:cvtutorials.com

目标

  • • 在本教程中,你将学习如何将图像从一个色彩空间转换为另一个色彩空间,如BGR ↔ 灰色,BGR ↔ HSV,等等。
  • • 此外,我们将创建一个应用程序,提取视频中的彩色物体。
  • • 你将学习以下函数:cv.cvtColor(),cv.inRange(),等等。

改变色彩空间

在OpenCV中,有超过150种色彩空间转换方法。但我们只研究两种最广泛使用的方法:BGR ↔ Gray和BGR ↔ HSV。

对于颜色转换,我们使用函数cv.cvtColor(input_image, flag),其中flag决定了转换的类型。

对于BGR → GRAY的转换,我们使用标志cv.COLOR_BGR2GRAY。类似地,对于BGR→HSV的转换,我们使用标志cv.COLOR_BGR2HSV。要获得其他标志,只需在你的Python终端运行以下命令。

代码语言:javascript
复制
>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print(flags )

备注:对于HSV,色调范围是[0,179],饱和度范围是[0,255],值范围是[0,255]。不同的软件使用不同的范围。因此,如果你将OpenCV的值与它们进行比较,你需要将这些范围归一化。

对象跟踪

现在我们知道了如何将BGR图像转换为HSV,我们可以用它来提取一个彩色物体。在HSV中,要比在BGR色彩空间中更容易表示一种颜色。在我们的应用中,我们将尝试提取一个蓝色的物体。因此,方法是这样的:

  1. 1. 取出视频的每一帧
  2. 2. 从BGR色彩空间转换为HSV色彩空间
  3. 3. 对HSV图像中的蓝色范围进行阈值处理
  4. 4. 现在单独提取蓝色物体,我们可以在该图像上做任何我们想做的事情

下面是代码,其中有详细的注释:

代码语言:javascript
复制
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

下面的图片显示了对蓝色物体的追踪:

注意事项:图像中存在一些噪音。我们将在后面的章节中看到如何消除它。这是物体追踪中最简单的方法。一旦你学会了轮廓线的功能,你就可以做很多事情,比如找到物体的中心点,用它来追踪物体,只需在相机前移动手就可以画图,以及其他有趣的事情。

如何找到HSV值来追踪?

这是在stackoverflow.com上发现的一个常见的问题。它非常简单,你可以使用同一个函数,cv.cvtColor()。你不需要传递图像,而只需要传递你想要的BGR值。例如,要找到绿色的HSV值,在Python终端尝试以下命令。

代码语言:javascript
复制
>>> 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范围。

练习

  • • 尝试找到一种方法来提取一个以上的彩色物体,例如,同时提取红色、蓝色和绿色物体。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器视觉全栈er 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档