科普 | 简单图像处理:用用二值化吧!
共 1909字,需浏览 4分钟
·
2021-06-02 14:53
引入
一张图像显示在显示屏上的时候,它斑斓多彩,轮廓分明(可你放的明明是张灰度图!),而当它被转化到数字设备当中的时候,我们看到的就将会是下面的情形:
![](https://filescdn.proginn.com/a4933f2283abc419322867bc917f3f46/136f730ebf23e60b975060f67e9f5a2c.webp)
是的,所有的色彩最后都会被变为一个个数字,在0到255之间来回徘徊,在一个个矩阵中被围困(突然诗意起来)。可以这样说,矩阵就是图像在数码设备中的表现形式。而正是因为他们由这些数字组成,才给了我们机会去用数字的方法来支配他们。
对于一张图片,我们往往不会对每一个地方都相同地感兴趣,总有一些特殊东西才是我们的目标。将目标区域和不想要的背景区域区分开我们就可以对这些数字下手。下面我们就说道说道二值化的那些事儿~
二值化
说起二值化,我们可以先来看看二值图像(百度上截的图片)
![](https://filescdn.proginn.com/110b1d1d2e9ce4f96b081f1d87d6bcb3/71c02dcc8ffcceb1e6d3d5bace19ed2b.webp)
二值图像(Binary Image)是指图像上的每一个像素只有两种可能的取值或灰度等级状态的图像。通常来讲就是我们常常看见的“非黑即白”的图像,也就是说,图像像素的灰度值无论在什么数据类型中都只有最大值和最小值两种取值。这种图像色彩类型少,可以进行高度的压缩,利于节省储存空间。
相应的,二值化就是把非二值图像经过计算变成二值图像。
在openCV4中有threshold()和adaptiveThreshold()可以来实现图像的二值化。
那么下面就先来介绍前一种啦
![](https://filescdn.proginn.com/683be22a165a0b1ba07b1eff0e5eefee/bf9e2fdcf15b7955af67a34d0187a579.webp)
输入输出的图像以及阈值和最大值大家都应该和好理解,那么什么是二值化方法的标志参数呢?
下面的表中大致就是可能会用的的一些标志参数和它们的含义:
![](https://filescdn.proginn.com/911934f76c1ad1cc8f358ac27d9e58c6/54d2ef8a0ccda92973c0b77e6a63e282.webp)
下图是前五种方法做二值化之后的信号示意图:
![](https://filescdn.proginn.com/9c904863df7a5d09e6c251eeb935bd61/74cc9b1e03c8a1949f911da01fce0b74.webp)
如同标志参数的作用介绍中说的,前五中标志参数都需要人为地设定一个阈值,之后才能进行二值化。人们进行二值化的目的往往是为了把目标物体和其他的东西分离开,形成图像的分割,但是有的时候为了分别这两者而设定的阈值往往不是那么简单就可以分得出来的,或者说,在对原始图像的灰度值分布不是那么了解的情况下是很难设定到自己想要的那种阈值的。
于是就有了下面的两个标志参数可以用来获取阈值:THRESH_OTSU(大津法)THRESH_TRIANGLE(三角形法)
问
那么什么是大津法呢
百度百科教我的:大津法也就是最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适合于双峰情况的自动求取阈值的方法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
![](https://filescdn.proginn.com/7ae8afc64558010ced5c0d6b46bc3370/fb5862bc7f8bef1114c954203e5c75d6.webp)
这是某一张图像的灰度直方图,我们可以看到它其实很明显地呈现出了适合利用大津法求阈值的双峰情况(灰度大都集中在某两个分离的区域之间),对某一假设的灰度值阈值将图像的灰度值分成背景和目标两部分,计算两组灰度值之间的类间方差,得到的方差值大致如图中的红色点所示。于是理所当然的,方差最高点所对应的灰度值正是我们能够合理分开目标和背景的阈值。
但是由于这两种方法往往是基于全局阈值,当图像中有一部分过度曝光或者说有阴影遮挡时,用这样的阈值选取方法就会显得有点不太好。
比如说,当你晚上写下一篇英语作文,想要拍照上传给老师批改,而在上传到某扫描王软件时,往往就会发生这样的事情:
![](https://filescdn.proginn.com/ecf87e40241996a2eba97f3466e4757d/b6a8c3366c3309c240320a4484bd1974.webp)
![](https://filescdn.proginn.com/7abea6cb504f7b17cea5dbe3c627e24f/98dd9a374cd4b24b9e2060aac2d1d7d9.webp)
于是我们就理所当然地想:有没有可以让这整张图中的字母大多数都能看清的方法呢?
很高兴,有的!
我们就要用到adaptiveThreshold(),它可以帮助我们得到局部自适应的阈值。(当然,先把图像分割,再用全局函数也不失为一种方法,不过相对比来说还是直接用adaptiveThreshold()来得更加方便快捷。
adaptive_mean是均值法自适应计算blockSize×blockSize邻域内的阈值,在这之后就可以进行二值化了。
![](https://filescdn.proginn.com/e89bf7a1dab5834513ddd332bad744db/fc3a43edc38616be734116954f3a3d56.webp)
![](https://filescdn.proginn.com/b9955f94decea301585026240f74e360/f9f3074e10d5cbf0f2952083f058dd14.webp)
因为是局部的阈值,所以就可以更加明确地在每一个地方都有比较好的区分,可以把大部分范围内的内容都更好地分割开来。
![分割线](https://filescdn.proginn.com/4eacc17e95c26facdebbcc709fa11272/d93487646c77e14237590a345877a577.webp)
![分割线](https://filescdn.proginn.com/4eacc17e95c26facdebbcc709fa11272/d93487646c77e14237590a345877a577.webp)
声明:部分内容来源于网络,仅供读者学术交流之目的。文章版权归原作者所有。如有不妥,请联系删除。
![](https://filescdn.proginn.com/54dbff5907d0d3f54236c6aa86a2a9d6/23ef4f22a9da2f97f9d3f99259dc0826.webp)