【从零学习OpenCV 4】图像二值化

重磅干货,第一时间送达

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

我们在上一节程序中生成了一张只有黑色和白色的图像,这种“非黑即白”的图像像素的灰度值无论在什么数据类型中只有最大值和最小值两种取值,因此称其为二值图像。二值图像色彩种类少,可以进行高度的压缩,节省存储空间,将非二值图像经过计算变成二值图像的过程称为图像的二值化。在OpenCV 4中提供了threshold()和adaptiveThreshold()两个函数用于实现图像的二值化,我们首先介绍threshold()函数的使用方法,该函数的函数原型在代码清单3-17中给出。

代码清单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

01

THRESH_BINARY和THRESH_BINARY_INV

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

(3.7)

1

02

THRESH_TRUNC

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

(3.8)

1

03

THRESH_TOZERO和THRESH_TOZERO_INV

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

(3.9)

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

图3-14 上述5种阈值比较法的信号示意图

1

04

THRESH_OTSU和THRESH_TRIANGLE

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

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

代码清单3-18 adaptiveThreshold()函数原型
1.  void cv::adaptiveThreshold(InputArray src,
2.                                OutputArray dst,
3.                                double  maxValue,
4.                                int  adaptiveMethod,
5.                                int  thresholdType,
6.                                int  blockSize,
7.                                double   C
8.                                   )
  • src:待二值化的图像,图像只能是CV_8UC1数据类型。

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

  • maxValue:二值化的最大值。

  • adaptiveMethod:自制应确定阈值的方法,分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C这两种。

  • thresholdType:选择图像二值化方法的标志,只能是THRESH_BINARY和THRESH_BINARY_INV。

  • blockSize:自适应确定阈值的像素邻域大小,一般为3,5,7的奇数。

  • C:从平均值或者加权平均值中减去的常数,可以为正,也可以为负。

该函数将灰度图像转换成二值图像,通过均值法和高斯法自适应的计算blockSize* blockSize邻域内的阈值,之后进行二值化,其原理与前面的相同,这里就不再赘述。

为了直观的体会到图像二值化的效果,在代码清单3-19中给出了分别对彩色图像和灰度图像进行二值化的示例程序,程序运行结果在图3-15、图3-16中给出。

代码清单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.  }

图3-15 threshold()函数处理结果

图3-16 adaptiveThreshold()函数处理结果

(0)

相关推荐

  • python+opencv图像处理(二)

    python+opencv图像处理(二) ----图像变换 自然界中有很多的颜色,红红的花,绿绿的草,蓝蓝的天,白白的云,多姿多彩的世界,美轮美奂的图像. 通过手机,照相机就可以定格每一个美的瞬间. ...

  • 第98天:图像库 PIL 实例—验证码去噪

    前面我们学习了 Python 的图像处理库 PIL,学会了一些相关的图像处理方法,好多人心里会问:有什么用呢?这一节我们就拿实际的例子来回答大家. 识别验证码的原理 现在大多数网站登录不再是简单地输入 ...

  • ROBOMASTER TT巡线.5(汇总)

    预备知识 预备知识分为两块,分别是:软件+硬件.相应的知识体系在下面的思维导图中有所体现. 最重要的是软件的搭建: Python环境搭建 Robomaster SDK安装 相关Python库的安装 注 ...

  • 【CV】基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  • 二值化处理与边缘检测

    问题:我在提取图像边缘的时候,首先对图像进行灰度变换,之后进行二值处理,最后进行边缘检测得到边缘图像. 但是在查阅资料的过程中我经常发现很多人忽略二值化的步骤,直接进行边缘检测:还有很多人在实现某些功 ...

  • (9条消息) OCR预处理:矫正图片中的文本信息(opencv)

    (9条消息) OCR预处理:矫正图片中的文本信息(opencv)

  • python进阶—OpenCV之常用图像操作函数说明

    文章目录 cv2.threshold cv2.bitwise_and cv2.bitwise_or cv2.bitwise_not cv2.inRange cv2.resize cv2.adaptiv ...

  • 自适应阈值化操作:adaptiveThreshold()函数

    在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果.而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样 ...

  • [OpenCV]经典霍夫变换原理

    本文主要讲述的是霍夫变换的一些内容,并加入一些在生活中的应用,希望能对读者对于霍夫变换的内容有所了解. 首先我先说的是,霍夫变换是一个特征提取技术.其可用于隔离图像中特定形状的特征的技术,应用在图像分 ...

  • 【从零学习OpenCV 4】中值滤波

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV】图像的保存&视频的保存

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 古籍文档图像二值化:基于背景估计和能量最小化的方法

    今日分享一篇论文『An enhanced binarization framework for degraded historical document images』,基于背景估计和能量最小化的古籍 ...

  • 论文推荐|【KSII TIIS 2021】DP-LinkNet:一种用于古籍文档图像二值化的卷积网络(有源码)

    详情信息如下: 作者信息:Wei Xiong, Xiuhong Jia, Dichun Yang, Meihui Ai, Lirong Li, Song Wang 单位信息:湖北工业大学电气与电子工程 ...

  • 【数据获取】建筑轮廓数据的N种获取方法(三:图像二值化)

    在之前的文章[数据获取]建筑轮廓数据的N种获取方法(一:数据简介与OSM网站的建筑轮廓数据获取)与[数据获取]建筑轮廓数据的N种获取方法(二:mapflow网站识别)里,我们已经介绍了建筑轮廓数据,并 ...

  • 【从零学习OpenCV 4】图像修复

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Mean-Shift分割算法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——分水岭法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...