Python OpenCV基于HSV的颜色分割实现示例
作者:胖大海pyh 发布时间:2021-11-04 19:24:26
前言
一周没有更新博客了,这一周的时间内加强了对机器学习和图像处理的学习。学的有点混乱,有必要记录一下。
深度学习可以解决很多问题,但有时候深度学习和图像处理相结合才能有更好的效果:比如,在进行交通信号灯检测时,用目标检测模型确定信号灯位置后,对信号灯进行颜色分割再识别可大大提高准确率。
机器学习领域中有句话:数据和特征决定了模型的上限,而算法只不过是逼近这个上限而已,所以了解机器学习的常用算法,熟悉机器学习中的特征工程是很有必要的。
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颜色分割的资料请关注脚本之家其它相关文章!
来源:https://blog.csdn.net/qq_40784418/article/details/106347196
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 背景np.loadtxt()用于从文本加载数据。文本文件中的每一行必须含有相同的数据。***loadtxt(fname,dtype=<
- 和C语言一样,引号属于特殊功能字符,不能够像普通字符那样直接通过print打印,需要进行一些处理,比如说反斜杠转义等。这里介绍几种打印三引号
- 位置参数这是一个求等差数列和的函数,使用必需要传入一个参数n,这就是位置参数def sum(n): sum=0 &
- 1 Git简介Git 是目前世界上最先进的分布式版本控制系统(没有之一)作用: 源代码管理为什么要进行源代码管理?
- server端代码:package main import ( "fmt" "net" "
- 在开发数据库应用中,经常会遇到处理时间的问题,如查询指定时间的记录等。下面就这些常见的问题,结合自己的一些经验,和大家探讨一下这类问题。首先
- 安装代码pip install python-docx1.批量化往word文件中添加大批量重复的数据from docx import Doc
- torch.Tensor类型的数据loss和acc打印时如果写成以下写法print('batch_loss: '+str(l
- 将ASCII字符转换为对应的数值即‘a'-->65,使用ord函数,ord('a')反之,使用chr函数,将数
- asp连接sql 第一种写法: 代码如下: MM_conn_STRING = "Driver={SQL Server};serv
- ASP日期和时间函数我们经常会用到,本文列出了12个常用的asp日期和时间函数的语法及用法以作备忘!1.Now Now() 取
- 一、进程介绍进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调度的基本单位。程序:没有执行的
- 轮播图的根本其实就是缓动函数的封装,如果说轮播图是一辆跑动的汽车,那么缓动函数就是它的发动机,今天本文章就带大家由简入繁,封装属于自己的缓动
- 前两天在帮朋友整理他的主页空间时候,发现的一点关于MySQL可能大家都会忽略的问题:我们知道,在安装完MySQL后,它会自动创建一个root
- 本文实例讲述了python中urllib模块用法。分享给大家供大家参考。具体分析如下:一、问题:近期公司项目的需求是根据客户提供的api,我
- 目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,
- 工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数
- 本文实例为大家分享了JavaScript实现简单计算器的具体代码,供大家参考,具体内容如下代码:<!DOCTYPE html>&
- 什么是deferdefer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法之前调用,也
- 在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有反引号括起来的内容。形如:type User struc