zoukankan      html  css  js  c++  java
  • opencv —— threshold、adaptiveThreshold 固定阈值 & 自适应阈值 进行图像二值化处理

    阈值化

    在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素。

    阈值分割可以视为最简单的图像分割方法。比如基于图像中物体与背景之间的灰度差异,可以利用阈值分割出我们需要的物体。这种分割是像素级的分割,为了从一幅图像中提取我们需要的部分,应该用图像中的每个像素点的灰度值与选择的阈值进行比较,并作出取舍判断。

    注意,阈值的选取依赖于具体问题,物体在不同的图片中可能会有不同的灰度值。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。例如可以将物体的像素点的灰度值设定为”0“(黑色),其他像素点的灰度值设为”255“(白色)。

    OpenCV 中 threshold() 函数(固定阈值操作)和 adaptiveThreshold() 函数(自适应阈值操作)可以满足这样的需求。它们的基本思想是:给定一个数组和一个阈值,根据数组中的每个元素的值是高于还是低于阈值而进行一些操作。

    固定阈值操作:threshold 函数

    threshold() 函数是对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像(compare 函数也可以达到此目的),或者去除噪声,过滤掉像素值很小或很大的图像点。

    double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
    • src,输入数组,填单通道、8 或 32 位浮点类型的 Mat 类型对象即可。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • thresh,阈值的具体值。
    • maxval,输出像素值的上限,仅当第五个参数阈值类型 type 取 THRESH_BINARY 或 THRESH_BINARY_INV 时会用到。
    • type,阈值类型。

    折线为将被阈值化的值,虚线为阈值

    THRESH_BINARY:大于阈值的部分被置为 maxval,小于部分被置为 0

    THRESH_BINARY_INV:大于阈值部分被置为 0,小于部分被置为 maxval

    THRESH_TRUNC:大于阈值部分被置为 thresh,小于部分保持原样  

    THRESH_TOZERO:小于阈值部分被置为 0,大于部分保持不变

    THRESH_TOZERO_INV:大于阈值部分被置为 0,小于部分保持不变

    THRESH_BINARY|THRESH_OTSU:使用最大类间差分法(THRESH_OTSU)获取阈值,然后再用该阈值进行二分,二分方法是上面 5 种选择。
    THRESH_BINARY|THRESH_TRIANGLE:使用三角法获取阈值,然后再用该阈值进行二分,二分方法是上面 5 种选择。

    • 返回值为 thresh

     

    自适应阈值操作:adaptiveThreshold 函数

    前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值的值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。

    double adaptiveThreshold (InputArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C);
    • src,输入数组,Mat 类的对象即可,但需要为 8 位单通道浮点型图像。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • maxVal,输出像素值的上限。
    • adaptiveMethod,用于指定要使用的自适应阈值算法。阈值有两种取值:

    ADAPTIVE_THRESH_MEAN_C :领域内均值

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

    • thresholdType,阈值类型。取值必须为 THRESH_BINARY 或 THRESH_BINARY_INV。
    • blockSize,用于计算阈值大小的一个像素的邻域尺寸,取值为 3、5、7。
    • C,阈值 = 平均或加权平均值 - C。为0相当于阈值 就是求得领域内均值或者加权值。

    代码示例:

    #include <opencv.hpp>
    using namespace cv;
    int main() {
        Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg", 0);
        imshow("src", src);
        
        Mat dst;
        threshold(src, dst, 150, 255, THRESH_BINARY);
        imshow("binary img", dst);
    
        adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);
        imshow("adaptive binary img", dst);
    
        waitKey(0);
    }

    效果展示:

     

    借鉴博客:https://blog.csdn.net/qq_37385726/article/details/82015545

    https://www.cnblogs.com/yinliang-liang/p/9293310.html

    ------------恢复内容开始------------

    阈值化

    在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素。

    阈值分割可以视为最简单的图像分割方法。比如基于图像中物体与背景之间的灰度差异,可以利用阈值分割出我们需要的物体。这种分割是像素级的分割,为了从一幅图像中提取我们需要的部分,应该用图像中的每个像素点的灰度值与选择的阈值进行比较,并作出取舍判断。

    注意,阈值的选取依赖于具体问题,物体在不同的图片中可能会有不同的灰度值。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。例如可以将物体的像素点的灰度值设定为”0“(黑色),其他像素点的灰度值设为”255“(白色)。

    OpenCV 中 threshold() 函数(固定阈值操作)和 adaptiveThreshold() 函数(自适应阈值操作)可以满足这样的需求。它们的基本思想是:给定一个数组和一个阈值,根据数组中的每个元素的值是高于还是低于阈值而进行一些操作。

    固定阈值操作:threshold 函数

    threshold() 函数是对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像(compare 函数也可以达到此目的),或者去除噪声,过滤掉像素值很小或很大的图像点。

    double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
    • src,输入数组,填单通道、8 或 32 位浮点类型的 Mat 类型对象即可。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • thresh,阈值的具体值。
    • maxval,输出像素值的上限,仅当第五个参数阈值类型 type 取 THRESH_BINARY 或 THRESH_BINARY_INV 时会用到。
    • type,阈值类型。

    折线为将被阈值化的值,虚线为阈值

    THRESH_BINARY:大于阈值的部分被置为 maxval,小于部分被置为 0

    THRESH_BINARY_INV:大于阈值部分被置为 0,小于部分被置为 maxval

    THRESH_TRUNC:大于阈值部分被置为 thresh,小于部分保持原样  

    THRESH_TOZERO:小于阈值部分被置为 0,大于部分保持不变

    THRESH_TOZERO_INV:大于阈值部分被置为 0,小于部分保持不变

    THRESH_BINARY | THRESH_OTSU:使用最大类间差分法(THRESH_OTSU)获取阈值,然后再用该阈值进行二分,二分方法是 | 左边方法。

    THRESH_BINARY_INV | THRESH_TRIANGLE:使用三角法获取阈值,然后再用该阈值进行二分,二分方法是 | 左边方法。

     

    自适应阈值操作:adaptiveThreshold 函数

    前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值的值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。

    double adaptiveThreshold (InputArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C);
    • src,输入数组,Mat 类的对象即可,但需要为 8 位单通道浮点型图像。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • maxVal,输出像素值的上限。
    • adaptiveMethod,用于指定要使用的自适应阈值算法。阈值有两种取值:

    ADAPTIVE_THRESH_MEAN_C :领域内均值

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

    • thresholdType,阈值类型。取值必须为 THRESH_BINARY 或 THRESH_BINARY_INV。
    • blockSize,用于计算阈值大小的一个像素的邻域尺寸,取值为 3、5、7。
    • C,阈值 = 平均或加权平均值 - C。为0相当于阈值 就是求得领域内均值或者加权值。

    代码示例:

    #include <opencv.hpp>
    using namespace cv;
    int main() {
        Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg", 0);
        imshow("src", src);
        
        Mat dst;
        threshold(src, dst, 150, 255, THRESH_BINARY);
        imshow("binary img", dst);
    
        adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);
        imshow("adaptive binary img", dst);
    
        waitKey(0);
    }

    效果展示:

     

    借鉴博客:https://blog.csdn.net/qq_37385726/article/details/82015545

    https://www.cnblogs.com/yinliang-liang/p/9293310.html

    ------------恢复内容开始------------

    阈值化

    在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素。

    阈值分割可以视为最简单的图像分割方法。比如基于图像中物体与背景之间的灰度差异,可以利用阈值分割出我们需要的物体。这种分割是像素级的分割,为了从一幅图像中提取我们需要的部分,应该用图像中的每个像素点的灰度值与选择的阈值进行比较,并作出取舍判断。

    注意,阈值的选取依赖于具体问题,物体在不同的图片中可能会有不同的灰度值。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。例如可以将物体的像素点的灰度值设定为”0“(黑色),其他像素点的灰度值设为”255“(白色)。

    OpenCV 中 threshold() 函数(固定阈值操作)和 adaptiveThreshold() 函数(自适应阈值操作)可以满足这样的需求。它们的基本思想是:给定一个数组和一个阈值,根据数组中的每个元素的值是高于还是低于阈值而进行一些操作。

    固定阈值操作:threshold 函数

    threshold() 函数是对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像(compare 函数也可以达到此目的),或者去除噪声,过滤掉像素值很小或很大的图像点。

    double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
    • src,输入数组,填单通道、8 或 32 位浮点类型的 Mat 类型对象即可。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • thresh,阈值的具体值。
    • maxval,输出像素值的上限,仅当第五个参数阈值类型 type 取 THRESH_BINARY 或 THRESH_BINARY_INV 时会用到。
    • type,阈值类型。

    折线为将被阈值化的值,虚线为阈值

    THRESH_BINARY:大于阈值的部分被置为 maxval,小于部分被置为 0

    THRESH_BINARY_INV:大于阈值部分被置为 0,小于部分被置为 maxval

    THRESH_TRUNC:大于阈值部分被置为 thresh,小于部分保持原样  

    THRESH_TOZERO:小于阈值部分被置为 0,大于部分保持不变

    THRESH_TOZERO_INV:大于阈值部分被置为 0,小于部分保持不变

    THRESH_BINARY | THRESH_OTSU:使用最大类间差分法(THRESH_OTSU)获取阈值,然后再用该阈值进行二分,二分方法是 | 左边方法。

    THRESH_BINARY_INV | THRESH_TRIANGLE:使用三角法获取阈值,然后再用该阈值进行二分,二分方法是 | 左边方法。

     

    自适应阈值操作:adaptiveThreshold 函数

    前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值的值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。

    double adaptiveThreshold (InputArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C);
    • src,输入数组,Mat 类的对象即可,但需要为 8 位单通道浮点型图像。
    • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
    • maxVal,输出像素值的上限。
    • adaptiveMethod,用于指定要使用的自适应阈值算法。阈值有两种取值:

    ADAPTIVE_THRESH_MEAN_C :领域内均值

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

    • thresholdType,阈值类型。取值必须为 THRESH_BINARY 或 THRESH_BINARY_INV。
    • blockSize,用于计算阈值大小的一个像素的邻域尺寸,取值为 3、5、7。
    • C,阈值 = 平均或加权平均值 - C。为0相当于阈值 就是求得领域内均值或者加权值。

    代码示例:

    #include <opencv.hpp>
    using namespace cv;
    int main() {
        Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg", 0);
        imshow("src", src);
        
        Mat dst;
        threshold(src, dst, 150, 255, THRESH_BINARY);
        imshow("binary img", dst);
    
        adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);
        imshow("adaptive binary img", dst);
    
        waitKey(0);
    }

    效果展示:

     

    借鉴博客:https://blog.csdn.net/qq_37385726/article/details/82015545

    https://www.cnblogs.com/yinliang-liang/p/9293310.html

    ------------恢复内容结束------------

    ------------恢复内容结束------------

  • 相关阅读:
    MATLAB计算机视觉与深度学习实战
    硬件创业:从产品创意到成熟企业的成功路线图
    Xcode5 创建模板和UIView 关联XIB
    iOS Development: Proper Use of initWithNibName:bundle: Affects UITableViewController
    自定义UIViewController与xib文件关系深入分析
    UIViewController XIB/NIB加载过程
    ios多视图开发中:xib与UIViewController的关联
    UIAlertView、UIActionSheet兼容iOS8
    Xcode6中怎么添加空工程模板
    [OC Foundation框架
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/12318691.html
Copyright © 2011-2022 走看看