温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python+OpenCV怎么实现阈值分割

发布时间:2022-05-16 15:56:33 来源:亿速云 阅读:253 作者:iii 栏目:开发技术

这篇文章主要介绍“Python+OpenCV怎么实现阈值分割”,在日常操作中,相信很多人在Python+OpenCV怎么实现阈值分割问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python+OpenCV怎么实现阈值分割”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、全局阈值

    原图:

    Python+OpenCV怎么实现阈值分割

    整幅图采用一个阈值,与图片的每一个像素灰度进行比较,重新赋值;

    1.效果图

    Python+OpenCV怎么实现阈值分割

    2.源码

    import cv2
    import matplotlib.pyplot as plt
    #设定阈值
    thresh=130
    #载入原图,并转化为灰度图像
    img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)
    img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3)
    #采用5种阈值类型(thresholding type)分割图像
    retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY)
    retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV)
    retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC)
    retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO)
    retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV)
    #采用plt.imshow()显示图像
    imgs=[img_original,img_binary,img_binary_invertion,img_trunc,img_tozero,img_tozero_inversion]
    titles=['original','binary','binary_inv','trunc','tozero','tozero_inv']
    for i in range(6):
        plt.subplot(2,3,i+1)
        plt.imshow(imgs[i],'gray')
        plt.title(titles[i])
        plt.xticks([])
        plt.yticks([])
    plt.show()

    二、滑动改变阈值(滑动条)

    1.效果图

    Python+OpenCV怎么实现阈值分割

    2.源码

    代码如下(示例):

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    #载入原图,转化为灰度图像,并通过cv2.resize()等比调整图像大小
    img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)
    img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3)
    #初始化阈值,定义全局变量imgs
    thresh=130
    imgs=0
    #创建滑动条回调函数,参数thresh为滑动条对应位置的数值
    def threshold_segmentation(thresh):
        #采用5种阈值类型(thresholding type)分割图像
        retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY)
        retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV)
        retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC)
        retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO)
        retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV)
        #由于cv2.imshow()显示的是多维数组(ndarray),因此我们通过np.hstack(数组水平拼接)
        #和np.vstack(竖直拼接)拼接数组,达到同时显示多幅图的目的
        img1=np.hstack([img_original,img_binary,img_binary_invertion])
        img2=np.hstack([img_trunc,img_tozero,img_tozero_inversion])
        global imgs
        imgs=np.vstack([img1,img2])
    #新建窗口
    cv2.namedWindow('Images')
    #新建滑动条,初始位置为130
    cv2.createTrackbar('threshold value','Images',130,255,threshold_segmentation)
    #第一次调用函数
    threshold_segmentation(thresh)
    #显示图像
    while(1):
        cv2.imshow('Images',imgs)
        if cv2.waitKey(1)==ord('q'):
            break
    cv2.destroyAllWindows()

    三、自适应阈值分割

    1.效果图

    Python+OpenCV怎么实现阈值分割

    2.源码

    代码如下(示例):

    import cv2
    import matplotlib.pyplot as plt
    #载入原图
    img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)
    #全局阈值分割
    retval,img_global=cv2.threshold(img_original,130,255,cv2.THRESH_BINARY)
    #自适应阈值分割
    img_ada_mean=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,3)
    img_ada_gaussian=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)
    imgs=[img_original,img_global,img_ada_mean,img_ada_gaussian]
    titles=['Original Image','Global Thresholding(130)','Adaptive Mean','Adaptive Guassian',]
    #显示图片
    for i in range(4):
        plt.subplot(2,2,i+1)
        plt.imshow(imgs[i],'gray')
        plt.title(titles[i])
        plt.xticks([])
        plt.yticks([])
    plt.show()

    3.GaussianBlur()函数去噪

    Python+OpenCV怎么实现阈值分割

    代码如下(示例):

    import cv2
    import matplotlib.pyplot as plt
    #载入原图
    img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)
    #高斯滤波
    img_blur=cv2.GaussianBlur(img_original,(13,13),13)  #根据情况修改参数
    #自适应阈值分割
    img_thresh=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)
    img_thresh_blur=cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)
    #显示图像
    imgs=[img_thresh,img_thresh_blur]
    titles=['img_thresh','img_thresh_blur']
    for i in range(2):
        plt.subplot(1,2,i+1)
        plt.imshow(imgs[i],'gray')
        plt.title(titles[i])
        plt.xticks([])
        plt.yticks([])
    plt.show()

    四、参数解释

    1.cv2.threshold(src, thresh, maxval, type)

    参数:

    src:输入的图像

    thresh:图像分割所用的阈值(threshold value)

    maxval:当阈值类型(thresholding type)采用cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV时像素点被赋予的新值

    type:介绍6种类型:

    cv2.THRESH_BINARY(当图像某点像素值大于thresh(阈值)时赋予maxval,反之为0。注:最常用)

    cv2.THRESH_BINARY_INV(当图像某点像素值小于thresh时赋予maxval,反之为0)

    cv2.THRESH_TRUNC(当图像某点像素值大于thresh时赋予thresh,反之不变。注:虽然maxval没用了,但是调用函数不能省略)

    cv2.THRESH_TOZERO(当图像某点像素值小于thresh时赋予0,反之不变。注:同上)

    cv2.THRESH_TOZERO_INV(当图像某点像素值大于thresh时赋予0,反之不变。注:同上)

    cv2.THRESH_OTSU(该方法自动寻找最优阈值,并返回给retval,见下文)

    返回值:

    retval:设定的thresh值,或者是通过cv2.THRESH_OTSU算出的最优阈值

    dst:阈值分割后的图像

    到此,关于“Python+OpenCV怎么实现阈值分割”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

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

    AI