zoukankan      html  css  js  c++  java
  • 图像二值化,阈值处理(十)

    图像二值化:基于图像的直方图来实现的,0白色 1黑色

    一 二值化

      定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

       一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

    二 阈值处理函数

      Python-OpenCV中提供了阈值(threshold)函数

    threshold(src, thresh, maxval, type, dst=None)

    函数:第一个参数       src            指原图像,原图像应该是灰度图。

              第二个参数         x              指用来对像素值进行分类的阈值。

              第三个参数         y              指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值

              第四个参数     Methods     

     

    method阈值类型一般分为五种: 

    • cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0 
    • cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值 
    • cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变 
    • cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0 
    • cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变

     

    三 全局阈值实例

    import cv2 as cv
    import numpy as np
    
    # 全局阈值
    def threshold_image(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        cv.imshow("原来", gray)
    
        # 大律法,全局自适应阈值 参数0可改为任意数字但不起作用
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        print("yuzhi:%s" % ret)
        cv.imshow("OTSU", binary)
    
        # TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
        ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
        print("yuzhi:%s" % ret)
        cv.imshow("TRIANGLE", binary)
    
        # 自定义阈值为150,大于150的是白色 小于的是黑色
        ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)
        print("yuzhi:%s" % ret)
        cv.imshow("define_yuzhi", binary)
    
        # 自定义阈值为150,大于150的是黑色 小于的是白色
        ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)
        print("yuzhi:%s" % ret)
        cv.imshow("define_rev", binary)
    
        # 截断 大于150的是改为150  小于150的保留
        ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)
        print("yuzhi:%s" % ret)
        cv.imshow("jieduan1", binary)
    
        # 截断 小于150的是改为150  大于150的保留
        ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)
        print("yuzhi:%s" % ret)
        cv.imshow("jieduan2", binary)
    
    
    src = cv.imread("yiner.jpg")
    threshold_image(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

    函数threshold()的参数说明:

    #大律法,全局自适应阈值 参数0可改为任意数字但不起作用   
     cv.THRESH_BINARY | cv.THRESH_OTSU 
    
     #TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰
     cv.THRESH_BINARY | cv.THRESH_TRIANGLE
    
     # 自定义阈值为150,大于150的是白色 小于的是黑色
      cv.THRESH_BINARY
    
    # 自定义阈值为150,大于150的是黑色 小于的是白色
      cv.THRESH_BINARY_INV 
    
    # 截断 大于150的是改为150  小于150的保留
       cv.THRESH_TRUNC 
    
    # 截断 小于150的是改为150  大于150的保留
       cv.THRESH_TOZERO 

    对应的阈值

     

    四 局部阈值处理

    1 函数

    adaptiveThreshold(  src, 
    maxValue,
    adaptiveMethod,
    thresholdType,
    blockSize,
    C,
    dst=None)

    2 参数解说.

    • 第一个src:原始图像
    • 第二个maxValue:像素值上限
    • 第三个自适应方法adaptiveMethod:

        — cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值

        —cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口

    • 第四个值的赋值方法:

        只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV

    • 第五个blockSize
        规定领域大小(一个正方形的领域)
    • 第六个常数C,

        阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)

      这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

    3 演示代码

    import cv2 as cv
    import numpy as np
    
    #局部阈值
    def local_yuzhi(image):
        gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
        cv.imshow('gray',gray)
    
        # ADAPTIVE_THRESH_MEAN_C 领域内均值
        binary1=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
        cv.imshow('local1',binary1)
    
        # ADAPTIVE_THRESH_GAUSSIAN_C 领域内像素点加权和,权重为一个高斯窗口
        binary2=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
        cv.imshow('local2',binary2)
    
    src = cv.imread("ying.jpg")
    local_yuzhi(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

    效果展示

    
    
  • 相关阅读:
    Socket开发框架之消息的回调处理
    Socket开发框架之数据加密及完整性检查
    Socket开发框架之数据传输协议
    Socket开发框架之框架设计及分析
    C#进行Visio二次开发之文件导出及另存Web页面
    Winform混合式开发框架的特点总结
    代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
    基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作
    基于C#的MongoDB数据库开发应用(4)--Redis的安装及使用
    基于C#的MongoDB数据库开发应用(3)--MongoDB数据库的C#开发之异步接口
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10673585.html
Copyright © 2011-2022 走看看