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

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

    1、什么是HSV

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

    Python OpenCV基于HSV的颜色分割如何实现  python 第1张

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

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

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

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

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

    Python OpenCV基于HSV的颜色分割如何实现  python 第2张

    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)

    Python OpenCV基于HSV的颜色分割如何实现  python 第3张

    Python OpenCV基于HSV的颜色分割如何实现  python 第4张

    Python OpenCV基于HSV的颜色分割如何实现  python 第5张


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

    读到这里,这篇“Python OpenCV基于HSV的颜色分割如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注蜗牛博客行业资讯频道。

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论电报频道链接