我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python OpenCV基于HSV的颜色分割实现示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python OpenCV基于HSV的颜色分割实现示例

前言

一周没有更新博客了,这一周的时间内加强了对机器学习和图像处理的学习。学的有点混乱,有必要记录一下。

深度学习可以解决很多问题,但有时候深度学习和图像处理相结合才能有更好的效果:比如,在进行交通信号灯检测时,用目标检测模型确定信号灯位置后,对信号灯进行颜色分割再识别可大大提高准确率。

机器学习领域中有句话:数据和特征决定了模型的上限,而算法只不过是逼近这个上限而已,所以了解机器学习的常用算法,熟悉机器学习中的特征工程是很有必要的。

1、什么是HSV

我们知道RGB颜色模式,通过不同的配比可以形成不同的颜色。HSV也是一种颜色模式,其模型如图所示

通过图示我们也能够看到,他和RGB颜色模型相似,也是由三个属性决定颜色,H、S、V分别是色彩、深度、明暗,按着图中方向的变化,其对应的颜色也会改变,三者也同样是有取值范围的:

  • H(色调):用角度度量,取值范围为0°~360°
  • S(饱和度):表示颜色接近光谱色的程度。通常取值范围为0%~100%,值越大,颜色越饱和。
  • V(明度):表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

HSV空间中三个指标相互独立,能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比,所以经常在HSV中进行颜色的分割识别。在HSV中各个颜色的范围见下表

2、代码实战

从网上下载了一张交通信号灯的图片,如图

我们的目的是进行颜色分割,将我们感兴趣的区域提取出来以方便下一步的操作。

2.1 createTrackbar使用方法及步骤

在开始实际操作之前,来了解一下createTrackbar。createTrackbar是Opencv中的API,其可在显示图像的窗口中快速创建一个滑动控件,用于手动调节阈值,具有非常直观的效果。可以直接观察阈值选择的效果,并确定想要的阈值。

使用Trackbar我们要了解两个函数;

(1)创建滑动条函数 

一个滑动条只能用于一个参数,如果需要改变多个参数,可以使用多个滑动条。

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)

各参数意义: 

trackbarName:滑动空间的名称; 

windowName:滑动空间用于依附的图像窗口的名称; 

value:初始化阈值; 

count:滑动控件的刻度范围;最小值默认为0。 

onChange:回调函数(所谓回调函数即每次修改滑动条后,需要传入新变量的函数)的名称,其定义如下:

onchange:void foo(int,void*)。

其中第一个参数是滑动条位置,第二个参数是用户数据(请参见下一个参数)。如果回调是空指针,则不调用回调,但只更新值

用户数据:按原样传递给回调的用户数据。它可以用来处理滑动条事件而不使用全局变量。

(2)获取滑动条的值函数

cv.getTrackbarPos获取滑动条位置处的值

g = cv2.getTrackbarPos(trackbarName2, windowName)
#第一个参数为滑动条1的名称,第二个参数为窗口的名称。

注意:需要在回调函数内部采用函数cv.getTrackbarPos获取滑动条位置处的值,不然如果存在多个滑动条时,函数无法获取更新后的参数值。

2.2 代码详解

import cv2
# 滑动条的回调函数,获取滑动条位置处的值
def empty(a):
    h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min, h_max, s_min, s_max, v_min, v_max)
    return h_min, h_max, s_min, s_max, v_min, v_max
path = 'Resources/11.jpg'
# 创建一个窗口,放置6个滑动条
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",19,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",110,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)
cv2.createTrackbar("Val Min","TrackBars",153,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
while True:
    img = cv2.imread(path)
    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    # 调用回调函数,获取滑动条的值
    h_min,h_max,s_min,s_max,v_min,v_max = empty(0)
    lower = np.array([h_min,s_min,v_min])
    upper = np.array([h_max,s_max,v_max])
    # 获得指定颜色范围内的掩码
    mask = cv2.inRange(imgHSV,lower,upper)
    # 对原图图像进行按位与的操作,掩码区域保留
    imgResult = cv2.bitwise_and(img,img,mask=mask)
    cv2.imshow("Mask", mask)
    cv2.imshow("Result", imgResult)
    cv2.waitKey(1)

其实在交通信号灯检测中,我们只需要获得掩码(mask图像)就可以进行识别了。

3、总结

颜色分割在很多场景都可以用到,结合深度学习会有更好的效果。后续将记录如何进行字符分割。字符分割的应用场景和思路应用同样广泛,更多关于Python OpenCV HSV颜色分割的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python OpenCV基于HSV的颜色分割实现示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python OpenCV基于HSV的颜色分割如何实现

本文小编为大家详细介绍“Python OpenCV基于HSV的颜色分割如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python OpenCV基于HSV的颜色分割如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-02

Python+OpenCV如何实现基于颜色的目标识别

这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。因为场地固定,背景单一,所以省下来很多操
2023-06-22

OpenCV基于分水岭算法的图像分割怎么实现

本文小编为大家详细介绍“OpenCV基于分水岭算法的图像分割怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“OpenCV基于分水岭算法的图像分割怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.
2023-07-05

python实现黄金分割法的示例代码

一.问题使用黄金分割法来计算 二.代码#黄金分割法python求解PPT上第一个例题 #因为函数要求解最大值而这个方法一般求解最小值所以把函数取负import numpy as np import matplotlib.pyplot as
2022-06-02

基于C#实现屏幕取色器的示例详解

这篇文章主要为大家详细介绍了如何利用C#实现屏幕取色器,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
2022-12-09

基于Python实现文件分类器的示例代码

这篇文章主要为大家详细介绍了如何基于Python实现文件分类器,目的主要是为了将办公过程中产生的各种格式的文件完成整理,感兴趣的可以了解一下
2023-05-14

Python+OpenCV实现图像基本操作的示例详解

这篇文章主要为大家详细介绍了Python通过OpenCV实现图像的一些基本处理操作的方法,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的可以学习一下
2023-05-16

基于Pytorch实现分类器的示例详解

这篇文章主要为大家详细介绍了如何基于Pytorch实现两个分类器: softmax分类器和感知机分类器,文中的示例代码讲解详细,需要的可以参考一下
2023-05-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录