美文网首页
阈值处理

阈值处理

作者: Tsukinousag | 来源:发表于2021-10-12 16:49 被阅读0次

    阈值处理是指剔除图像内像素高于一定值或者低于一定值的像素点

    返回阈值,dst=cv2.threshold(src,thresh,maxvel,type)
    

    二值化阈值处理(cv2.THRESH_BINARY)

    会将原始图像处理为仅有两个值的二值图像

    • 对于灰度值>thresh的像素点,灰度值设置为maxvel
    • 对于灰度值<=thresh的像素点,灰度值设置为0
    import cv2
    
    img=cv2.imread("D:/renlian.jpg")
    
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    反二值化阈值处理(cv2.THRESH_BINARY_INV)

    • 对于灰度值>thresh的像素点,灰度值设置为0
    • 对于灰度值<=thresh的像素点,灰度值设置为maxvel
    import cv2
    
    img=cv2.imread("D:/renlian.jpg")
    
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    截断阈值处理(CV2.THRESH_TRUNC)

    • 大于thresh的像素点的值设定为阈值
    • 小于等于thresh的像素点的值保持不变
    import cv2
    
    img=cv2.imread("D:/renlian.jpg")
    
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
    
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    超阈值零处理(cv2.THRESH_TOZERO_INV)

    • 大于阈值的像素点的值处理为0
    • 小于等于该阈值的像素点的值保持不变
    import cv2
    
    img=cv2.imread("D:/renlian.jpg")
    
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
    
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    低阈值0处理(cv2.THRESH_TOZERO)

    • 大于阈值的像素点的值保持不限
    • 小于等于该阈值的像素点处理为0
    import cv2
    
    img=cv2.imread("D:/renlian.jpg")
    
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
    
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    自适应阈值处理

    使用自动变换的阈值完成对图像的阈值处理

    dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
    
    • 8位单通道图像
    • 最大值
    • 自适应方法

    cv2.ADAPTIVE_THRESH_MEAN_C

    邻域所有像素点的权重值是一致的

    cv2.ADAPTIVE_THRESH_GAUSSIAN_C

    与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值

    • cv2.THRESH_BINARY / cv2.THRESH_BINARY_INV
    • 3,5,7
    • 常量
    import cv2
    
    img=cv2.imread("D:/hjb.jpg",0)
    
    #二值化阈值处理
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    
    #两个自适应阈值处理的效果
    thdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
    
    thdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
    
    cv2.imshow("img",img)
    cv2.imshow("thd",thd)
    cv2.imshow("thdMEAN",thdMEAN)
    cv2.imshow("thdGAUS",thdGAUS)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    可以看出,普通的阈值处理会丢失大量的信息,而自适应阈值处理可以得到效果更好的二值图像


    Otsu处理

    遍历所有可能的阈值,从而找到最佳的阈值

    cv2.threshold()中对参数type+cv2.THRESH_OTSU

    在使用Otsu方法时,要把阈值设为0

    import cv2
    import numpy as np
    
    img=np.zeros((5,5),dtype=np.uint8)
    
    img[0:5,0:5]=123
    img[2:5,2:5]=126
    
    print(img)
    
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    
    print(thd)
    
    t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    
    print(t2,otsu)
    
    [[123 123 123 123 123]
     [123 123 123 123 123]
     [123 123 126 126 126]
     [123 123 126 126 126]
     [123 123 126 126 126]]
    
    [[0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]]
    
    123.0 
    
    [[  0   0   0   0   0]
     [  0   0   0   0   0]
     [  0   0 255 255 255]
     [  0   0 255 255 255]
     [  0   0 255 255 255]]
    
    import cv2
    
    img=cv2.imread("D:/hjb.jpg",0)
    
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    
    t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    
    cv2.imshow("img",img)
    cv2.imshow("thd",thd)
    cv2.imshow("otsu",otsu)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    相关文章

      网友评论

          本文标题:阈值处理

          本文链接:https://www.haomeiwen.com/subject/qbndoltx.html