通过可视化找到图片最佳的二值化的值

依然范特西╮ 提交于 2019-11-29 14:00:37

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

import cv2

def threshTrackbar(img):
    """
    使二值化图片过程可视化
    :param img: 待二值化的灰度图
    :return thr_v,Shading:阈值,大于阈值时替代的值
    """
    img_copy = img
    def nothing(x):
        pass
    # 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)

原图:

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!