美文网首页计算机视觉之python-opencv
python-openCV入门(三)--二值化操作

python-openCV入门(三)--二值化操作

作者: 创客们杂货铺掌柜 | 来源:发表于2019-02-16 22:36 被阅读0次

    目录

    全局阀值
    局部阀值

    前言

    在灰度图像的处理中,经常会用到二值化处理,二值化处理中最常用是就是全局阀值和局部阀值。
    我们将对下面这一幅照片进行处理。


    TIM图片20190216230535.png

    全局阀值

    # -*- coding=GBK -*-
    import cv2 as cv
    
    image = cv.imread("2.jpg")
    
    #全局阈值
    
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  #把输入图像灰度化
        #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
    print("threshold value %s"%ret)
    cv.namedWindow("binary0", cv.WINDOW_NORMAL)
    cv.imshow("normal", gray)
    cv.imshow("binary0", binary)
    
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    全局阀值二值化图像


    TIM图片20190216230528.png

    函数说明

    函数说明:

    第一个参数表示输入图像,必须为单通道灰度图。

    第二个参数表示输出的边缘图像,为单通道黑白图。

    第三个参数表示阈值

    第四个参数表示最大值。

    第五个参数表示运算方法。

    在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。

    /* Threshold types */

    CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */
    
    CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */
    
    CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */
    
    CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */
    
    CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */
    
    CV_THRESH_MASK        =7,
    
    CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */
    

    注释已经写的很清楚了,因此不再用中文来表达了。

    局部阀值

    import cv2 as cv
    
    image = cv.imread("2.jpg")
    #全局阈值
    
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  #把输入图像灰度化
        #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10)
    
    cv.namedWindow("binary0", cv.WINDOW_NORMAL)
    cv.imshow("normal", gray)
    cv.imshow("binary0", binary)
    
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    局部阀值二值化图像


    wed.png

    自适应阈值化能够根据图像不同区域亮度分布的,改变阈值,具体调用方法如下:

    
    void cv::adaptiveThreshold(
        cv::InputArray src, // 输入图像
        cv::OutputArray dst, // 输出图像
        double maxValue, // 向上最大值
        int adaptiveMethod, // 自适应方法,平均或高斯
        int thresholdType // 阈值化类型
        int blockSize, // 块大小
        double C // 常量
    );
    

    cv::adaptiveThreshold()支持两种自适应方法,即cv::ADAPTIVE_THRESH_MEAN_C(平均)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯)。
    在两种情况下,自适应阈值T(x, y)。通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。其中,b由blockSize给出,大小必须为奇数;如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到。

    相关文章

      网友评论

        本文标题:python-openCV入门(三)--二值化操作

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