通过可视化找到图片最佳的二值化/颜色分割的值

32 篇文章 1 订阅
13 篇文章 1 订阅

  一、可视化二值化

        在图片预处理的过程中,我们常常需要二值化图片,但是二值化值一个个去试,比较麻烦。下面通过trackbar来可视化连续二值化图片的情景。代码如下:

import cv2

def threshTrackbar(img):
    """
    使二值化图片过程可视化
    :param img: 待二值化的图片
    :return thr_v,Shading:阈值,大于阈值时替代的值
    """
    # 确定图片是否是彩色,如果是则灰度化
    if len(img.shape) == 3:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    def nothing(x):
        pass

    img_copy = img
    # Create a window
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', OnMouseAction)
    # create trackbars for color change
    cv2.createTrackbar('thr', 'image', 121, 255, nothing)
    cv2.createTrackbar('Shading', 'image', 255, 255, nothing)
    while (True):
        cv2.imshow('image', img)
        k = cv2.waitKey(1) & 0xFF
        # 通过关闭窗口的右上角关闭
        if cv2.getWindowProperty('image', cv2.WND_PROP_AUTOSIZE) < 1:
            break
        # 通过按键盘的ESC退出
        if k == 27:
            break
        # get current positions of four trackbars
        thr_v = cv2.getTrackbarPos('thr', 'image')
        shading = cv2.getTrackbarPos('Shading', 'image')
        _, img = cv2.threshold(img_copy, thr_v, shading, cv2.THRESH_BINARY)

    cv2.destroyAllWindows()
    return thr_v, shading

def OnMouseAction(event,x,y,flags,param):
    """
    鼠标的回调函数,处理鼠标事件
    :param event: 
    :param x: 
    :param y: 
    :param flags: 
    :param param: 
    :return: 
    """
    if event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击")
    elif event==cv2.EVENT_RBUTTONDOWN :
        print("右键点击")
    elif flags==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳")
    elif event==cv2.EVENT_MBUTTONDOWN :
        print("中键点击")

if __name__ == '__main__':
    img = cv2.imread('1.jpg')
    #cv2.imshow("src", img)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #cv2.imshow("gray", gray)

    thr, shading = threshTrackbar(gray)
    print(thr, shading)
    _, thr_img = cv2.threshold(gray, 121, 255, cv2.THRESH_BINARY)

原图:

二值化过程可视界面(可以通过红色剪头拖拽改变二值化的值,以便找到最佳的二值化值):

二、可视化颜色分割

        BGR颜色空间转HSV,然后分割。效果如下。

import cv2


def OnMouseAction(event,x,y,flags,param):
    """
    鼠标的回调函数,处理鼠标事件
    :param event:
    :param x:
    :param y:
    :param flags:
    :param param:
    :return:
    """
    if event == cv2.EVENT_LBUTTONDOWN:
        print("左键点击")
    elif event==cv2.EVENT_RBUTTONDOWN :
        print("右键点击")
    elif flags==cv2.EVENT_FLAG_LBUTTON:
        print("左鍵拖曳")
    elif event==cv2.EVENT_MBUTTONDOWN :
        print("中键点击")


def threshTrackbar(hsv):
    """

    :param img: 待二值化的图片
    :return thr_v,Shading:阈值,大于阈值时替代的值
    """

    def nothing(x):
        pass

    hsv_copy = hsv
    # Create a window
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', OnMouseAction)
    # create trackbars for color change
    cv2.createTrackbar('H1', 'image', 0, 180, nothing)
    cv2.createTrackbar('H2', 'image', 180, 180, nothing)
    cv2.createTrackbar('S1', 'image', 0, 255, nothing)
    cv2.createTrackbar('S2', 'image', 255, 255, nothing)
    cv2.createTrackbar('V1', 'image', 0, 255, nothing)
    cv2.createTrackbar('V2', 'image', 255, 255, nothing)
    while (True):
        cv2.imshow('image', hsv)
        k = cv2.waitKey(1) & 0xFF
        # 通过关闭窗口的右上角关闭
        if cv2.getWindowProperty('image', cv2.WND_PROP_AUTOSIZE) < 1:
            break
        # 通过按键盘的ESC退出
        if k == 27:
            break
        # get current positions of four trackbars
        H1 = cv2.getTrackbarPos('H1', 'image')
        H2 = cv2.getTrackbarPos('H2', 'image')
        S1 = cv2.getTrackbarPos('S1', 'image')
        S2 = cv2.getTrackbarPos('S2', 'image')
        V1 = cv2.getTrackbarPos('V1', 'image')
        V2 = cv2.getTrackbarPos('V2', 'image')

        hsv = cv2.inRange(hsv_copy, (H1, S1, V1), (H2, S2, V2))

    cv2.destroyAllWindows()
    return [H1, S1, V1], [H2, S2, V2]


imgPath = "./images_jiangling/001_000002.png"
if __name__ == "__main__":
    img = cv2.imread(imgPath)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    cv2.imshow("hsv", hsv)
    cv2.waitKey(0)

    print(threshTrackbar(hsv))

        效果图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值