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

作者:胖大海pyh 时间:2021-11-04 19:24:26 

前言

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

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

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

1、什么是HSV

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

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

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

  • H(色调):用角度度量,取值范围为0°~360°

  • S(饱和度):表示颜色接近光谱色的程度。通常取值范围为0%~100%,值越大,颜色越饱和。

  • V(明度):表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

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

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

2、代码实战

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

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

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

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)

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

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

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

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

3、总结

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

来源:https://blog.csdn.net/qq_40784418/article/details/106347196

标签:Python,OpenCV,HSV,颜色分割
0
投稿

猜你喜欢

  • Python标准库calendar的使用方法

    2023-09-01 01:28:07
  • 如何得到数据库中所有表名 表字段及字段中文描述

    2012-01-05 18:56:44
  • 详解mysql 组合查询

    2024-01-20 10:43:06
  • 在Python的web框架中配置app的教程

    2023-03-28 12:12:17
  • Python SQLAlchemy入门教程(基本用法)

    2022-10-05 04:08:55
  • centos6.7安装python2.7.11的具体方法

    2022-04-29 00:42:54
  • MySQL UPDATE时主键冲突引发的思考

    2008-06-21 17:00:00
  • PyQt5+serial模块实现一个串口小工具

    2021-04-25 00:51:19
  • vue中的mescroll搜索运用及各种填坑处理

    2024-04-30 10:26:39
  • python中as用法实例分析

    2023-08-11 01:12:26
  • 也来谈谈”完美”跨域

    2008-12-19 12:34:00
  • Oracle数据安全面面观

    2024-01-20 02:12:38
  • python环境路径配置以及命令行运行脚本

    2023-09-19 21:19:05
  • opencv实现简单人脸识别

    2021-08-26 07:49:06
  • MySQL中truncate误操作后的数据恢复案例

    2024-01-12 20:45:56
  • python如何重载模块实例解析

    2021-10-13 03:47:56
  • MYSQL配置参数优化详解

    2024-01-21 08:17:44
  • MAC版修改MySQL初始密码的方法

    2024-01-19 03:19:56
  • 简单谈谈Python中的几种常见的数据类型

    2021-05-24 06:20:48
  • GoLang中Strconv库有哪些常用方法

    2024-05-09 10:11:17
  • asp之家 网络编程 m.aspxhome.com