二值化方法

一、全局阈值法

1.固定阈值方法

该方法是对于输入图像中的所有像素点统一使用同一个固定阈值。其基本思想如下:

其中,T为全局阈值。

 

缺点:很难为不同的输入图像确定最佳阈值。

 

2.Otsu算法

Otsu算法又称最大类间方差法

先明确两个概念:

(1)均值

(2)方差

 

图像的阈值化处理,就是将图像分为两个部分,高于阈值的部分,和小于阈值的部分。(暂不考虑多阈值的情况)。那么,如果将图像的每一个像素点的强度作为一个数据集合中的单元,那么,阈值化就相当于是一个二分类的问题。

 

图像的阈值化处理,就是将图像分为两个部分,高于阈值的部分,和小于阈值的部分。(暂不考虑多阈值的情况)。那么,如果将图像的每一个像素点的强度作为一个数据集合中的单元,那么,阈值化就相当于是一个二分类的问题。

 

我们假设,大于阈值的类为S1,维度为n1(不考虑秩的问题,实际上就是像素个数),均值为m1;小于阈值的类记为S2,维度为n2,均值为m2。根据前面概率的知识,理想的情况下,对于每一个类,其类内方差应该是很小的。

 

当然了,考虑每一个类是可行的。但是,我们又可以换个思路,全局上来考虑呢?

 

假设整个图像的均值为m,我们假设就只有两个数据,m1,m2,考虑着两个数据的离散程度,同样可以用上面的方差公式。这里看起来有点怪怪的,暂且这样来理解吧。也就是说,方差越大,这两个类也就越离散,分的越开。就像吵架一样,吵得声音越大,说明分歧越大,越严重。

 

所以,我们求这个阈值时,就希望,在内部是很团结的,就是在阈值分割后,两个类中,每一个类都是很和谐的。但是,相互之间又非常的受不了对方,离的越远越好。那么,找到这样的阈值,就十分开心了。

缺点:当目标物体与背景大小比例悬殊或灰度级接近,导致直方图呈现三峰或双峰峰值差距极大时,Otsu算法往往得不到满意的结果

 

二、局部阈值法

 

1.自适应阈值算法

自适应阈值算法[2]用到了积分图(Integral Image)的概念,它是一个快速且有效地对网格的矩形子区域计算和的算法。积分图中任意一点 (x, y) 的值是从图左上角到该点形成的矩形区域内所有值之和。图2-5b中的灰色部分为图2-5a中灰色矩阵内值的加和:

自适应阈值算法的主要思想是以一个像素点为中心设置大小为 s×s 的滑窗,滑窗扫过整张图像,每次扫描均对窗口内的像素求均值并将均值作为局部阈值。若窗口中的某一像素值低于局部阈值t/100,赋值为0;高于局部阈值t/100,赋值为255。因为涉及多次对有重叠的窗口进行加和计算,因此积分图的使用可以有效地降低复杂度和操作次数。为了计算积分图,我们在每个位置存储其左边和上方所有 f(x, y) 值的总和,这一步骤会在线性时间内完成:

                                                                   I(x, y)= f(x, y)+I(x-1, y)+I(x, y-1)-I(x-1, y-1)

一旦得到积分图,对于任意从左上角 (x1y1, ) 到右下角(x2y2, ) 的矩形内(如图2-6所示)的数值总和均可以使用式(2.2)计算:

流程共扫描全图两次,第一次扫描获得积分图intImg,第二次扫描根据式(2.2)计算每次扫描窗口内像素值的平均值的(100-t)/100,并将计算结果作为局部阈值。若窗口内某一像素点的值乘以窗口大小大于该阈值,则对应输出255,反之则输出0。

2. Niblack算法

Niblack算法同样是根据窗口内的像素值来计算局部阈值的,不同之处在于它不仅考虑到区域内像素点的均值和方差,还考虑到用一个事先设定的修正系数 k 来决定影响程度。

                                                                                  T(x, y)=m(x, y)+ks(x, y)

其中,T(x, y) 为阈值,m(x, y)、s(x, y) 分别代表均值与方差。与 m(x, y) 相近的像素点被判定为背景,反之则判定为前景,而相近的程度则由标准差和修正系数来决定,这样做可以保证算法的灵活性。

 

缺点:Niblack算法的缺陷一方面在于 r × r 的滑窗会导致在边界区域(r-1)/2的像素范围内无法求取阈值;另一方面在于如果 r×r 滑窗内全部是背景,那么该算法必然会使一部分像素点成为前景,形成伪噪声。因此,r的选择非常关键,若窗口太小,则不能有效地抑制噪声;若窗口太大,则会导致细节丢失。

 

3. Sauvola算法

Sauvola算法是针对文档二值化处理,在Niblack算法基础上的改进:

 

其中,R是标准方差的动态范围,若当前输入图像是8位灰度图像,则 R=128。Sauvola算法在处理光线不均匀或染色图像时,比Niblack算法拥有更好的表现,因为式(2.3)以自适应的方式放大了标准差s的作用。假设我们要处理一份浅色但有污渍的文档,那么乘以m系数会降低背景区域阈值的范围,这可以有效地减少染色、污渍等带来的影响。表2-1展示了Sauvola与Niblack算法在处理染色文档时的效果差异。

三、其他方法

对于灰度图而言,腐蚀和膨胀运算都类似于卷积操作——将结构元素在原图上平移,而结构元素上的原点就相当于卷积核的核中心。首先我们约定,将结构元素覆盖住的原图区域记为P。

1.腐蚀

如图2-10所示,腐蚀运算即在平移过程中依次计算 P 和 结构元素的差矩阵,并将该矩阵中的最小值赋给原点对应的原图位置.

2.膨胀

如图2-11所示,膨胀运算则是计算 P 和结构元素的和矩阵,并将该矩阵中的最大值赋给原点对应的原图位置。

3.开运算

开运算是先腐蚀后膨胀,开运算可以使图像的轮廓变得光滑,断开狭窄的连接并消除细毛刺

 

4.闭运算

闭运算是先膨胀后腐蚀.闭运算同样可以平滑轮廓,但其具体作用是排除小型空洞,弥合狭窄的间断点、沟壑以及填补断裂的轮廓线。

 

 

 

 

热门文章

暂无图片
编程学习 ·

Java内存管理-初始JVM和JVM启动流程(二)

上一篇分享了什么是程序,以及Java程序运行的三个阶段。也顺便提到了Java中比较重要的一个东西就是JVM(JAVA 虚拟机),那么今天在先了解一下JVM和JVM的启动流程。知识地图:1、什么是虚拟机虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全…
暂无图片
编程学习 ·

8080端口被占怎么办 ,解决方法

用后端springboot启动,8080端口 报错 8080 in use 打开 控制台 win+R 输入 cmd 进入后输入netstat -ano 肉眼能找到找就完事了如果找不到 输入netstat -aon|findstr “8080”找到最后一列的那个数字 “26252”, 就是PID 码 然后打开系统的 任务管理器 ,你要是任务管理器都不…
暂无图片
编程学习 ·

kafka+zookeeper消息队列

软件包提取码:u3s1 kafka: 起初是做采集日志的,和zookeeper一起才能做消息队列,可持久化。kafka broker(server): 消息中间件处理的节点 一个Kafka节点就是一个broker(server) topic = vhost -类消息 对消息进行分类主题-个类型-个主题topic可以有多个 partition = que…
暂无图片
编程学习 ·

Django 接收并解析POST请求参数

使用Django框架搭建一个简单的web服务,java程序去调用Django提供的接口: 1. Django接收GET请求并解析参数 # 直接使用request.GET.get就可以获取参数 request.GET.get(id,0)2. Django接收POST请求并解析参数 使用postman模拟POST请求,需要关闭csrftoken的验证:将settings.p…
暂无图片
编程学习 ·

nginx从下载到部署全过程(Linux)

导航NGINX官网下载NGINX安装环境解压,编译,安装启动及测试NGINX官网以下列举了三个网址,分别是:NGINX官网,下载网址及官方文档。官方网站:http://nginx.org/下载网址:http://nginx.org/en/download.html官方文档:http://nginx.org/en/docs/ 下载NGINX 通过官方下载地址…
暂无图片
中恒嘉业 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络:信息往一个方向流动。包括MLP和CNN 循环神经网络:信息循环流动,网络隐含层输出又作为自身输入,包括RNN、LSTM、GAN等。 RNN模型结构如下图所示: 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
郑州普通话 ·

[Redux/Mobx] 在Redux中怎么发起网络请求?

[Redux/Mobx] 在Redux中怎么发起网络请求? 如果单纯的使用Redux,因为redux的actionCreator返回一个plain object,所以不能在actionCreator中发起网络请求;reducer是一个纯函数,不能有副作用,所以也不能有异…
暂无图片
郑州普通话 ·

[Redux/Mobx] Redux和vuex有什么区别?

[Redux/Mobx] Redux和vuex有什么区别? 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的 个人简介 我是歌谣,欢迎和大家一起交流前后端知…
暂无图片
代理记账 ·

[Redux/Mobx] 在Redux中怎么发起网络请求?

[Redux/Mobx] 在Redux中怎么发起网络请求? 如果单纯的使用Redux,因为redux的actionCreator返回一个plain object,所以不能在actionCreator中发起网络请求;reducer是一个纯函数,不能有副作用,所以也不能有异…
暂无图片
代理记账 ·

[Redux/Mobx] Redux和vuex有什么区别?

[Redux/Mobx] Redux和vuex有什么区别? 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的 个人简介 我是歌谣,欢迎和大家一起交流前后端知…
暂无图片
cgfy ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络:信息往一个方向流动。包括MLP和CNN 循环神经网络:信息循环流动,网络隐含层输出又作为自身输入,包括RNN、LSTM、GAN等。 RNN模型结构如下图所示: 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
coreui ·

[Redux/Mobx] Redux和vuex有什么区别?

[Redux/Mobx] Redux和vuex有什么区别? 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的 个人简介 我是歌谣,欢迎和大家一起交流前后端知…
暂无图片
未来博客 ·

[Redux/Mobx] Redux和vuex有什么区别?

[Redux/Mobx] Redux和vuex有什么区别? 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的 个人简介 我是歌谣,欢迎和大家一起交流前后端知…
暂无图片
建站日记 ·

[Redux/Mobx] Redux和vuex有什么区别?

[Redux/Mobx] Redux和vuex有什么区别? 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的 个人简介 我是歌谣,欢迎和大家一起交流前后端知…
暂无图片
mfbz ·

[Redux/Mobx] 在Redux中怎么发起网络请求?

[Redux/Mobx] 在Redux中怎么发起网络请求? 如果单纯的使用Redux,因为redux的actionCreator返回一个plain object,所以不能在actionCreator中发起网络请求;reducer是一个纯函数,不能有副作用,所以也不能有异…
暂无图片
mfbz ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络:信息往一个方向流动。包括MLP和CNN 循环神经网络:信息循环流动,网络隐含层输出又作为自身输入,包括RNN、LSTM、GAN等。 RNN模型结构如下图所示: 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
珊珊日记 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络:信息往一个方向流动。包括MLP和CNN 循环神经网络:信息循环流动,网络隐含层输出又作为自身输入,包括RNN、LSTM、GAN等。 RNN模型结构如下图所示: 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
珊珊日记 ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法! 拓扑排序的过程中,由于需要查找所有以某顶点为尾的弧,即找到该顶点的所有出边,故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同,由于要查找入度为0的点…