首页 > 其他分享 >17.图像二值化

17.图像二值化

时间:2023-04-09 13:44:29浏览次数:33  
标签:标志 17 阈值 THRESH 图像 灰度 二值化 函数

threshold()函数

代码清单3-17 threshold()函数原型
1.  double cv::threshold(InputArray src,
2.                         OutputArray dst,
3.                         double  thresh,
4.                         double  maxval,
5.                         int  type
6.                         )
  • src:待二值化的图像,图像只能是CV_8U和CV_32F两种数据类型。对于图像通道数目的要求和选择的二值化方法相关。

  • dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数。

  • thresh:二值化的阈值。

  • maxval:二值化过程的最大值,此函数只在THRESH_BINARY和THRESH_BINARY_INV两种二值化方法中才使用,但是在使用其他方法是也需要输入。

  • type:选择图像二值化方法的标志。

  该函数是众多二值化方法的集成,所有的方法都实现了一个功能,就是给定一个阈值,计算所有像素灰度值与这个阈值关系,得到最终的比较结果。函数中有些阈值比较方法输出结果的灰度值并不是二值的,而是具有一个取值范围,不过为了体现其最常用的功能,我们仍然称其为二值化函数或者阈值比较函数。函数的部分参数和返回值都是针对特定的算法才有用,但是即使不使用这些算法在使用函数时也需要明确的给出,不可缺省。函数的最后一个参数是选择二值化计算方法的标志,可以选择二值化方法以及控制哪些参数对函数的计算结果产生影响,该标志可以选择的范围及含义在表3-2中给出。

表3-2 二值化方法可选择的标志及含义

标志参数

简记

作用

THRESH_BINARY

0

灰度值大于阈值为最大值,其他值为0

THRESH_BINARY_INV

1

灰度值大于阈值为0,其他值为最大值

THRESH_TRUNC

2

灰度值大于阈值的为阈值,其他值不变

THRESH_TOZERO

3

灰度值大于阈值的不变,其他值为0

THRESH_TOZERO_INV

4

灰度值大于阈值的为零,其他值不变

THRESH_OTSU

8

大津法自动寻求全局阈值

THRESH_TRIANGLE

16

三角形法自动寻求全局阈值

接下来将详细的介绍每种标志对应的二值化原理和需要的参数。

1、THRESH_BINARY和THRESH_BINARY_INV

这两个标志是相反的二值化方法,THRESH_BINARY是将灰度值与阈值(第三个参数thresh)进行比较,如果灰度值大于阈值就将灰度值改为函数中第四个参数maxval的值,否则将灰度值改成0。THRESH_BINARY_INV标志正好与这个过程相反,如果灰度值大于阈值就将灰度值改为0,否则将灰度值改为maxval的值。这两种标志的计算公式在式(3.7)中给出。

 

2、THRESH_TRUNC

这个标志相当于重新给图像的灰度值设定一个新的最大值,将大于新的最大值的灰度值全部重新设置为新的最大值,具体逻辑为将灰度值与阈值thresh进行比较,如果灰度值大于thresh则将灰度值改为thresh,否则保持灰度值不变。这种方法没有使用到函数中的第四个参数maxval的值,因此maxval的值对本方法不产生影响。这种标志的计算公式在式(3.8)中给出。

3、THRESH_TOZERO和THRESH_TOZERO_INV

这两个标志是相反的阈值比较方法, THRESH_TOZERO表示将灰度值与阈值thresh进行比较,如果灰度值大于thresh则将保持不变,否则将灰度值改为0。THRESH_TOZERO_INV方法与其相反,将灰度值与阈值thresh进行比较,如果灰度值小于等于thresh则将保持不变,否则将灰度值改为0。这种两种方法都没有使用到函数中的第四个参数maxval的值,因此maxval的值对本方法不产生影响。这两个标志的计算公式在式(3.9)中给出。

前面五种标志都支持输入多通道的图像,在计算时分别对每个通道进行阈值比较。为了更加直观的理解上述阈值比较方法,我们假设图像灰度值是连续变化的信号,将阈值比较方法比做滤波器,绘制连续信号通过滤波器后的信号形状,结果如图3-14所示,图中红线为设置的阈值,黑线为原始信号通过滤波器后的信号形状。

4、THRESH_OTSU和THRESH_TRIANGLE

这两种标志是获取阈值的方法,并不是阈值的比较方法的标志,这两个标志可以和前面5种标志一起使用,例如“THRESH_BINARY| THRESH_OTSU”。前面5种标志在调用函数时都需要人为的设置阈值,如果对图像不了解设置的阈值不合理,会对处理后的效果造成严重的影响,这两个标志分别表示利用大津法(OTSU)和三角形法(TRIANGLE)结合图像灰度值分布特性获取二值化的阈值,并将阈值以函数返回值的形式给出。因此如果函数最后一个参数设置了这两个标志中的任何一个,那么函数第三个参数thresh将由系统自动给出,但是在调用函数的时候仍然不能缺省,只是程序不会使用这个数值。需要注意的是,目前为止OpenCV 4中针对这两个标志只支持输入CV_8UC1类型的图像。

threshold()函数全局只使用一个阈值,在实际情况中由于光照不均匀以及阴影的存在,全局只有一个阈值会使得在阴影处的白色区域也会被函数二值化成黑色,因此adaptiveThreshold()函数提供了两种局部自适应阈值的二值化方法,该函数的函数原型在代码清单3-18中给出。

代码清单3-19 myThreshold.cpp图像二值化
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  #include <vector>
4.  
5.  using namespace std;
6.  using namespace cv;
7.  
8.  int main()
9. {
10.    Mat img = imread("lena.png");
11.    if (img.empty())
12.    {
13.      cout << "请确认图像文件名称是否正确" << endl;
14.      return -1;
15.    }
16.  
17.    Mat gray;
18.    cvtColor(img, gray, COLOR_BGR2GRAY);
19.    Mat img_B, img_B_V, gray_B, gray_B_V, gray_T, gray_T_V, gray_TRUNC;
20.  
21.    //彩色图像二值化
22.    threshold(img, img_B, 125, 255, THRESH_BINARY);
23.    threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV);
24.    imshow("img_B", img_B);
25.    imshow("img_B_V", img_B_V);
26.  
27.    //灰度图BINARY二值化
28.    threshold(gray, gray_B, 125, 255, THRESH_BINARY);
29.    threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV);
30.    imshow("gray_B", gray_B);
31.    imshow("gray_B_V", gray_B_V);
32.  
33.    //灰度图像TOZERO变换
34.    threshold(gray, gray_T, 125, 255, THRESH_TOZERO);
35.    threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV);
36.    imshow("gray_T", gray_T);
37.    imshow("gray_T_V", gray_T_V);
38.  
39.    //灰度图像TRUNC变换
40.    threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC);
41.    imshow("gray_TRUNC", gray_TRUNC);
42.  
43.    //灰度图像大津法和三角形法二值化
44.    Mat img_Thr = imread("threshold.png", IMREAD_GRAYSCALE);
45.    Mat img_Thr_O, img_Thr_T;
46.    threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU);
47.    threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE);
48.    imshow("img_Thr", img_Thr);
49.    imshow("img_Thr_O", img_Thr_O);
50.    imshow("img_Thr_T", img_Thr_T);
51.  
52.    //灰度图像自适应二值化
53.    Mat adaptive_mean, adaptive_gauss;
54.    adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C,
55.                                                                           THRESH_BINARY, 55, 0);
56.    adaptiveThreshold(img_Thr, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C,
57.                                                                           THRESH_BINARY, 55, 0);
58.  
59.    imshow("adaptive_mean", adaptive_mean);
60.    imshow("adaptive_gauss", adaptive_gauss);
61.    waitKey(0);
62.    return 0;
63.  }

 

标签:标志,17,阈值,THRESH,图像,灰度,二值化,函数
From: https://www.cnblogs.com/okmai77xue/p/17300223.html

相关文章

  • 2217. 找到指定长度的回文数
    题目描述给了一个正整数k,表示长度是k的所有回文数字再给了和很多q,问第q小的数字是多少?f1数学关系+构造基本分析从q之间的相互关系考虑还是单独考虑某个q和结果的关系?后者长度是k的回文数字有啥特性?前一半数字是固定的,half=k+1>>2,str[num][:half]以上性质和q有啥......
  • 1617. 统计子树中城市之间最大距离
    题目链接:1617.统计子树中城市之间最大距离方法:子集型回溯+判断连通+树的直径解题思路枚举所有可能的子树参考:子集型回溯判断当前的子树是否合法,即当前树是否连通,通过\(dfs\)从某一个节点开始遍历子树,若遍历节点数量不等于子树节点数量,则不连通;计算以每一个子树节点为......
  • 面试题 17.05. 字母与数字
    题目链接:面试题17.05.字母与数字方法:TwoSum解题思路(1)将字符量化为\(+1\),数字量化为\(-1\),那么当子数组的和\(subSum=0\)时,表示子数组中的字符和数字的数量相等;(2)\(subSum=s[j]-s[i],j>=i,i=1,2,...\),\(s[i]\)表示前\(i\)个元素的和;(3)即找\(s[j]-s[i]=0\),也即......
  • 10.图像的读取与显示
    1、图像读取函数imread()代码清单2-24imread()函数的原型cv::Matcv::imread(constString&filename,intflags=IMREAD_COLOR)filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名flags:读取图像形式的标志,如将彩色图像按......
  • 【图像检测】基于DCT和arnold实现水印篡改检测附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • C++,OpenCV图像像素运算(6)
    参与算术运算图像的数据类型、通道数目、大小必须相同算术运算加法:addvoidadd(InputArraysrc1,InputArraysrc2,OutputArraydst,InputArraymask=noArray(),intdtype=-1);/******************************************************************** src1: 输入图1* ......
  • 『0017』 - Solidity Types - Solidity 枚举(Enums)
    作者:黎跃春,案例下面的代码是我对官方案例作了简单的修改而成。ActionChoices就是一个自定义的整型,当枚举数不够多时,它默认的类型为uint8,当枚举数足够多时,它会自动变成uint16,下面的GoLeft==0,GoRight==1,GoStraight==2,SitStill==3。在setGoStraight方法中,我们传入的参数......
  • 图像修补
    #include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/photo/photo.hpp>usingnamespacestd;usingnamespacecv;#defineWINDOW_NAME0&qu......
  • dnstracer CVE-2017-9430 复现
    author:cxingdate:2023-4-7introduction:DNSTracer是一个用来跟踪DNS解析过程的应用程序。DNSTracer1.9及之前的版本中存在栈缓冲区溢出漏洞。攻击者可借助带有较长参数的命令行利用该漏洞造成拒绝服务(应用程序崩溃)、甚至RCE。环境搭建本人Linux虚拟机信息如下:OS64位......
  • EasyARM i.MX283A 完整系统制作指南(Linux 4.13.2+U-Boot 2017.09+BusyBox 1.27.2+Qt5
    原文:https://www.taterli.com/3213/标题老长呢.反正什么都是新的,所有都是开源的,除了下载工具以外,所有源码都有(据说下载工具也有,我懒得找了.),编译器源码自己也能做,但是没必要了.代码下载地址:https://github.com/nickfox-taterli/imx283a-new/releases/tag/v0.1首先有一个U......