• Python机器视觉--OpenCV进阶(核心)--图像二值化


    1.图像二值化

    1.1 图像全局二值化

    • 二值化: 将图像的每个像素变成两种值, 比如0, 255.

    • threshold(src, thresh, maxval, type[, dst])

      • src 最好是灰度图

      • thresh: 阈值

      • maxval: 最大值, 最大值不一定是255

      • type: 操作类型. 常见操作类型如下:

    简单解释:

    • 1.若图片数值大于 阈值 则变为255(白色)否则为0(黑色)
    • 2.倒置1. 即 大于 阈值 为0 小于则为255
    • 3.相当于抹平 即 大于 阈值 则为阈值 小于 不受影响
    • 4.变零操作 即 大于阈值 不受影响 小于阈值 则变为0
    • 5.倒置4 即 小于阈值 不受影响 大于阈值 则变为0
    代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./dog.jpeg')
    
    #cvtColor 用于将图像进行灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 返回两个结果, 一个是阈值, 另一个是处理后的图片
    ret, dst = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY)
    
    cv2.imshow('dog', np.hstack((gray, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    1.2 自适应阈值二值化

    在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

    • adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
        这种方法需要我们指定六个参数,返回值只有一个。
      • Adaptive Method- 指定计算阈值的方法。
              – cv2.ADAPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
              – cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
      • hresholdType:二值化方法,可以设置为THRESH_BINARY或者THRESH_BINARY_INV
        blockSize:分割计算的区域大小,取奇数
      • Block Size - 邻域大小(用来计算阈值的区域大小)。
      • C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
    代码实现
    import numpy as np
    import cv2
    
    img=cv2.imread('./code/dog.jpeg')
    
    #二值化操作是对灰度图片进行操作,因此需要将图片灰度化
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    dst=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0)
    
    cv2.imshow('dog',np.hstack((gray,dst)))
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    结果如下

    在这里插入图片描述

    cv2.ADAPTIVE_THRESH_MEAN_C, 与cv2.ADPTIVE_THRESH_GAUSSIAN_C 的对比

    import numpy as np
    import cv2
    
    img=cv2.imread('./code/dog.jpeg')
    
    #二值化操作是对灰度图片进行操作,因此需要将图片灰度化
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    dst=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,0)
    dst2=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0)
    cv2.imshow('dog',np.hstack((gray,dst,dst2)))
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    cv2.THRESH_BINARY 与cv2.THRESH_BINARY_INV 的对比

    import numpy as np
    import cv2
    
    img=cv2.imread('./code/dog.jpeg')
    
    #二值化操作是对灰度图片进行操作,因此需要将图片灰度化
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    dst=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0)
    dst2=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV ,9,0)
    cv2.imshow('dog',np.hstack((gray,dst,dst2)))
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    threshold 与 adaptiveThreshold 对比

    import numpy as np
    import cv2
    img=cv2.imread('./code/dog.jpeg')
    cv2.namedWindow('img',cv2.WINDOW_NORMAL)
    #二值化操作是对灰度图片进行操作,因此需要将图片灰度化
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 全局二值化
    thres,dst=cv2.threshold(gray,130,255,cv2.THRESH_BINARY)
    #自适应二值化 
    dst2=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0)
    
    cv2.imshow('img',np.hstack((gray,dst,dst2)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

  • 相关阅读:
    51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)
    【vue】vue+easyPlayer 实现宫格布局及视频播放
    二叉搜索树经典笔试题【力扣、牛客】
    riscv-gcc工具编译firmware进行仿真问题总结
    玩游戏掉帧严重?看过来!
    华为RH2288 V3安装 Linux 系统,安装过程心得
    基于遗传算法优化BP神经网络的非线性函数拟合(一维高斯函数)研究-含Matlab代码
    【Leetcode HOT100】不同的二叉搜索树 c++
    k8s网络模型介绍:pod内/间通信
    上海理工大学计算机考研资料汇总
  • 原文地址:https://blog.csdn.net/qq_43944517/article/details/126569864