美文网首页
阈值处理

阈值处理

作者: 长歌行夜一 | 来源:发表于2020-06-08 13:44 被阅读0次

    OpenCV提供了两个函数cv2.threshold() 和 cv2.adaptiveThreshold(),用于实现阈值处理。

    1.cv2.threshold()函数

    retval,dst =cv2.threshold(src, thresh, maxval,type)

    式中

    -- retval 代表返回的阈值;

    -- dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型;

    -- src 代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值;

    -- thresh 代表要设定的阈值;

    -- maxval代表当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设置的最大值;

    -- type代表要分割的类型。

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

    会将原始图像处理为仅包含两个值的二值图像。将大于阈值的像素点其灰度值设为最大值。小于或等于阈值的像素点设置为0。(在8位图像中,最大值是255)

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

    也是得到一幅二值图像。与cv2.THRESH_BINARY相反,大于阈值的像素点设定为0;大于小于阈值的设定为最大值。

    代码如下:

    img = cv2.imread('wasser_2.jpg')

    # 默认指定原图像坐标(0,0)为缩小区域以外的颜色。

    # mapxy = scale_img(img, 2)

    shape_img = img.shape

    # 二值化处理

    yu, rst = cv2.threshold(img,180,255,type=cv2.THRESH_BINARY)

    # 反二值化处理

    yu2, rst_f = cv2.threshold(img,180,255,type=cv2.THRESH_BINARY_INV)

    cv2.imshow("img",img)

    cv2.imshow("erzhi_img_%s"%yu,rst)

    cv2.imshow("erzhi_img_f%s"%yu,rst_f)

    return_value = cv2.waitKey(0)

    cv2.destroyAllWindows()

    效果:(注意原始图像是彩色图)

    3)截断阈值化处理(cv2.THRESH_TRUNC)

    将超过阈值的像素点的值设为阈值。

    4)超阈值零处理(cv2.THRESH_TOZERO_INV)

    将超过阈值的像素点的值设为零。

    5)低于阈值零处理(cv2.THRESH_TOZERO)

    将低于阈值的像素点的值设为零。

    2.自适应阈值处理

    对于色彩均衡的图像,直接用一个阈值就能完成对图像的阈值化处理。但是有时候图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清洗有效的阈值分割图像。

    自适应阈值处理:通过计算像素点周围邻近区域的加权平均值获得阈值。并使用该阈值对当前像素点进行处理。·该方法能够很好的处理明暗差异较大的图像。

    方法:cv2.adaptiveThreshold()

    cv2.adaptiveThreshold(src,maxvalue,adaptiveMethod,thresholdType,blockSize,C)

    src :代表原始图像,而且该图像必须是8位单通道的图像;

    adaptiveMethod :代表自适应方法,包含cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法。两种方法都是逐个元素计算自适应阈值,自适应阈值等于每个像素由blockSize所指定邻域的加权平均值减去常量C;

    maxvalue :代表最大值;

    thresholdType : 代表阈值的处理方式,该值必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY中的一个;

    blockSize :代表块大小,表示计算阈值时所使用的邻域尺寸,通常为3、5、7等;

    C :是常量

    例如提取彩色图像的G通道来进行自适应阈值处理:

    meanAth = cv2.adaptiveThreshold(img[:,:,1],255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)

    gaussAth = cv2.adaptiveThreshold(img[:,:,1],255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)

    3.Otsu处理

    Otsu方法能够根据当前图像给出最佳的类间分割阈值(通过遍历所有可能阈值)。通过在cv2.threshold()的type参数的类型多传递一个参数"cv2.THRESH_OTSU",并且将阈值设为零,即可实现Otsu阈值分割,并且返回最优阈值和分割结果。注:该方法只适用于处理单通道数据。

    相关文章

      网友评论

          本文标题:阈值处理

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