c++opencv汉字分割_机器学习小白,还不快pick一下——【视觉与图像:阈值分割】...

前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?【视觉与图像】Python+OpenCV教程入门篇就找到了想要的答案(点蓝字即可打开)

今天周五了!

今天还不下雨!!

今天又可以更新了!!!

581a66ac880ca5196370ea8cbafdef84.gif

先前小天邀请老王和大家聊到Python+OpenCV的第5波:颜色空间转换(点蓝字即可打开),那么接下来老王给同学们带来的是Python+OpenCV第6篇章:阈值分割,还不快收藏?住!

文章交代:

  • 学习使用不同的阈值方法”二值化”图像

推荐人群:

  • 初级入门、机器学习小白、技术爱好者

【图片可到文末?本节源码下载。】

阈值分割

01目标
  • 使用固定阈值、自适应阈值和Otsu阈值法”二值化”图像

  • OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()

02固定阈值分割

固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。

a09e357eb48d355ab78e604ed8110b8f.png

38e726da6f47c59e071678f64157628c.png

cv2.threshold()用来实现阈值分割,ret是return value缩写,代表当前的阈值,暂时不用理会。函数有4个参数:

  • 参数1:要处理的原图,*一般是灰度图

  • 参数2:设定的阈值

  • 参数3:最大阈值,一般为255

  • 参数4:阈值的方式,主要有5种,详情:http://t.cn/EfZhnbq

下面结合代码理解下这5种阈值方式:

bc5dcdc7251915bd422b2ab49ef064ff.png

2b0fb2465228f5ba8fc04bde08a3bcb5.png

Tips:很多人误以为阈值分割就是二值化。从上图中可以发现,两者并不等同,阈值分割结果是两类值,而不是两个值,所以教程开头我把二值化加了引号。

16dec91b848a4ae5aa869bd2726fcbc0.png

03自适应阈值

看得出来固定阈值是在整幅图片上应用一个阈值进行分割,它并不适用于明暗分布不均的图片。 cv2.adaptiveThreshold()自适应阈值会每次取图片的一小部分计算阈值,这样图片不同区域的阈值就不尽相同。它有5个参数,其实很好理解,先看下效果:

400053e51886094376ab6f324632e308.png

ca133b4c0e5c7ac07bf275f07e3ef80d.png

  • 参数1:要处理的原图

  • 参数2:最大阈值,一般为255

  • 参数3:小区域阈值的计算方式

  1. ADAPTIVE_THRESH_MEAN_C:小区域内取均值

  2. ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核

  • 参数4:阈值方式(跟前面讲的那5种相同)

  • 参数5:小区域的面积,如11就是11*11的小块

  • 参数6:最终阈值等于小区域计算出的阈值再减去此值

如果你没看懂上面的参数也不要紧,暂时会用就行,当然我建议你调整下参数看看不同的结果。

04Otsu阈值

在前面固定阈值中,我们是随便选了一个阈值如127,那如何知道我们选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。Otsu阈值法就提供了一种自动高效的二值化方法,不过我们直方图还没学,这里暂时略过。

好吧,44adf7db93e1a6638058a021a86d4b9b.png我知道激起了你的兴趣~ o( ̄▽ ̄)o,有能力的童鞋可以看下继续往下看番外篇~

05小结

cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。 二值化跟阈值分割并不等同。针对不同的图片,可以采用不同的阈值方法。

06练习

Otsu阈值是一种高效的二值化算法,请阅读(番外篇)?

引用

  • 本节源码 http://t.cn/EfZcSIJ

  • Image Thresholding http://t.cn/EfZcHyc

大部分图像处理任务都需要先进行二值化操作,阈值的选取很关键,Otsu阈值法会自动计算阈值。

Otsu阈值法(日本人大津展之提出的,也可称大津算法)非常适用于双峰图片,啥意思呢?

Otsu N. A threshold selection method from gray-level histograms[J]. IEEE transactions on systems, man, and cybernetics, 1979, 9(1): 62-66. (http://t.cn/EfZx2dl)

f8637b14ae202d8f49aefe6ee1835dac.png1.什么是双峰图片

双峰图片就是指图片的灰度直方图上有两个峰值,直方图就是每个值(0~255)的像素点个数统计,后面会详细介绍。

0aa26883edb56d3b14165c3c08388616.png

Otsu算法假设这副图片由前景色和背景色组成,通过统计学方法(最大类间方差)选取一个阈值,将前景和背景尽可能分开,我们先来看下代码,然后详细说明下算法原理。

f8637b14ae202d8f49aefe6ee1835dac.png2.代码示例

下面这段代码对比了使用固定阈值和Otsu阈值后的不同结果:

另外,对含噪点的图像,先进行滤波操作效果会更好。

111aeeb482b66dba19be10a213a2e60a.png

下面我们用Matplotlib把原图、直方图和阈值图都显示出来:

38da83cc79fb2b19c5ac9b390393c602.png

288996b475c788d811a39b4a21b392c0.png

可以看到,Otsu阈值明显优于固定阈值,省去了不断尝试阈值判断效果好坏的过程。其中,绘制直方图时,使用了numpy中的ravel()函数,它会将原矩阵压缩成一维数组,便于画直方图。

f8637b14ae202d8f49aefe6ee1835dac.pngOtsu算法详解

Otsu阈值法将整幅图分为前景(目标)和背景,以下是一些符号规定:

  • T:分割阈值

  • N0:前景像素点数

  • N1:背景像素点数

  • ω0:前景的像素点数占整幅图像的比例

  • ω1:背景的像素点数占整幅图像的比例

  • μ0:前景的平均像素值

  • μ1:背景的平均像素值

  • μ:整幅图的平均像素值

  • rows×cols:图像的行数和列数

结合下图会更容易理解一些,有一副大小为4×4的图片,假设阈值T为1,那么:

03c50f7bf222b1e328e2be0b677d3710.png

其实很好理解,N0+N1就是总的像素点个数,也就是行数乘列数:

d8103caa797dff7208568884a0f3a9cf.png

ω0和ω1是前/背景所占的比例,也就是:

5de3deae37a8c93558ac34bf6e365510.png

整幅图的平均像素值就是:

d1fa05a0d6523962b70f29da6984fdfc.png

‍‍此时,我们定义一个前景μ0与背景μ1" role="presentation" style="font-size: 15px; box-sizing: border-box; display: inline-table; line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; background-color: rgb(255, 255, 255);">μ1μ1的方差g" role="presentation" style="font-size: 15px; box-sizing: border-box; display: inline-table; line-height: 0; text-align: left; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; background-color: rgb(255, 255, 255);">gg:‍‍

bb23c2ed371fb9872f5909d83e973604.png

将前述的1/2/3公式整合在一起,便是:

283f47235ecf098e1eeb72ea1831a1b9.png

g" role="presentation" style="box-sizing: border-box; display: inline-table; line-height: 0; text-align: left; font-size: 18.08px; overflow-wrap: normal; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border-width: 0px; border-style: initial; border-color: initial; padding-top: 1px; padding-bottom: 1px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; background-color: rgb(255, 255, 255);">‍‍g就是前景与背景两类之间的方差,这个值越大,说明前景和背景的差别也就越大,效果越好。Otsu算法便是遍历阈值T,使得g最大,所以又称为最大类间方差法。基本上双峰图片的阈值T在两峰之间的谷底。‍‍

引用

  • 本节源码 http://t.cn/EfZcSIJ http://t.cn/EfZp5Vg

  • numpy.ravel http://t.cn/EfZpQL9

  • Otsu’s Method(wikipedia) http://t.cn/EfZpFlb

  • Image Thresholding http://t.cn/EfZcHyc

  • 一维OTSU法、最小交叉熵法、二维OTSU法及C++源码 http://t.cn/EfZ0gBq

  • Otsu N. A threshold selection method from gray-level histograms[J]. IEEE transactions on systems, man, and cybernetics, 1979, 9(1): 62-66. http://t.cn/EfZOfK3

0b4304ab631d0dbb98bb4f9cae6b58eb.png

如果你也有想分享的干货,可以登录天池实验室(notebook),包括赛题的理解、数据分析及可视化、算法模型的分析以及一些核心的思路等内容。

小天会根据你分享内容的数量以及程度,给予丰富的神秘天池大礼以及粮票奖励。分享成功后你也可以通过下方钉钉群?主动联系我们的社区运营同学(钉钉号:doqclsn 或 yiwen1991)

6a3dea374f526c38b5674b3321373a43.png

天池宝贝们有任何问题,可在戳“留言”评论或加入钉钉群留言,小天会认真倾听每一个你的建议!003c3dd697fe2ba85a8ba06d69d56583.png

4f480c3e79c717ca232ce05b20a44d50.gif

点击下方图片即可阅读

50fde545d0cfab83c7f40cb5601c0962.png

如何使用PAI深度学习TensorFlow读写OSS教程?

baa1e68ba422d70ad3c4c0f0807c8a21.png

如果你会模型融合!那么,我要和你做朋友

ce8723b86d3f764ee2da956df6651d68.png

《流浪地球》为何从不被看好到票房榜首,数据分析给你答案!

6e0ba8f349f2543937b5778ae642888e.png

除了奖金还送800万入驻权益,未来科技城——智能城市建设合伙人大赛正式启动啦!

92ed649f44637b8f1ffdde1fb53c2ac4.png     AI安全新探索,IJCAI-19阿里巴巴人工智能对抗算赛,约一波?

a65c53a27c43467fe739f38e53a3972e.gif563b9ea2ecdc36648a651be1108ab36d.png

听说戳了的人都?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习笔记--理解生成器

在学习python的时候,刚开始接触生成器(generator)这个概念的时候,其实还是不太能理解,感觉并没有完全掌握,今天看到这篇文章的时候,感觉对这个概念真的是有了进一步的了解,感觉生成器…

再不努力我就老了

借用李宇春歌里的一句话,再不疯狂我们就老了。。。再不努力青春就没了。。。 今天在浏览校内时,发现右下角滚动的照片中,竟有一张是关于自己的,那是自己5年前的照片,满脸的稚嫩,连自己都承认那时的自己真的…

mysql主键外键_MySQL主键和外键使用及说明

摘自网上一个经典的例子:大哥和小弟一、外键约束MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持)&#x…

python学习笔记--迭代器

转载自理解Python的迭代器 首先,廖雪峰老师的教程中解释了迭代器和生成器,这篇文章只是补充和我个人的总结。 什么是迭代 可以直接作用于for循环的对象统称为可迭代对象(Iterable)。 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterat…

【转载】周鸿祎:做产品体验先把自己切换到二傻子模式

我唯一能自吹的地方,就是本人在互联网里可能犯的错最多,挨的骂最多,然后也经历了很多失败,所以这样才有一些真实的感受。 建议大家把《定位》和《创新者的窘境》、《创新者的解答》这几本书放在身边反复读。你经历得越多&#xff…

mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)

mysql常用的hint对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法。同样,在mysql里,也有类似的hint功能。下面介绍一些常用的。强制索引 FORCE INDEX复制代码代码如下:SELECT * FROM TA…

python学习--windows下安装Numpy包的错误:Unable to find vcvarsall.bat

今天在安装numpy包的时候,无论是通过pip install numpy 还是上网下载numpy包后安装都是出现问题:error: Unable to find vcvarsall.bat,于是百度了下,看到Windows下安装Python包(Numpy)的错误:Unabletofindvcvarsall.b…

使用多行sql字符串时,要注意不要忽略了空格

使用李刚老师编著的《疯狂Java讲义》(第2版)学习MySql数据库与JDBC编程(使用Java 7 ),其中第601页的ConnMySql.java 程序代码在Eclipse上运行,出现错误。 import java.sql.*; public class ConnMySql{publi…

Python学习笔记---理解zip()函数

转载自Python零碎知识(2):强大的zip 一、代码引导 首先看这一段代码: 1 >>> name(jack,beginman,sony,pcky)2 >>> age(2001,2003,2005,2000)3 >>> for a,n in zip(name,age):4 print a,n5 6 输出:7 jack 20018 beginma…

mysql8.0.11 安装顺序_mysql 8.0.11 安装步骤详解

本文为大家分享了mysql 8.0.11 安装步骤,供大家参考,具体内容如下第一步:下载安装包MYSQL官方下载地址:官方下载这里第一项是在线安装,第二项是离线包安装,我选择的是第二项(不用管你电脑是多少位的操作系统…

HDU1258 DFS

题意&#xff1a;求n个数中的某些数的和等于t&#xff0c;并输出 dfs 记录下已经输出过的&#xff0c;然后每次比较一下&#xff0c;这样就能避免重复 View Code 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<algorithm>5…

Python 问题--encode、decode及shell中文输出

最近在使用python的时候&#xff0c;涉及到中文输出的时候经常会出现乱码的问题&#xff0c;所以就上网搜索了下&#xff0c;参考了1.Python字符串的encode与decode研究心得乱码问题解决方法&#xff1b; 2.python 中编码的再次学习 此外&#xff0c;更多详细字符编码的可以看…

MYSQL中什么是规范化_如何规范化SQL数据库

小编典典这是在脚本中标准化表的示例。我建议你做这样的事情e.g Table: tbl_tmpDataDate, ProductName, ProductCode, ProductType, MarketDescription, Units, Value2010-01-01, Arnotts Biscuits, 01, Biscuit, Store 1, 20, 20.002010-01-02, Arnotts Biscuits, 01, Biscuit…

python 模块学习--Numpy

Numpy是Python的一个科学计算库&#xff0c;提供了矩阵运算的功能。安装方法可以直接使用pip install numpy命令&#xff0c;也可以在http://sourceforge.net/projects/numpy/files/NumPy/上下载与python相应版本的exe文件。 这里就记录下在学习和使用Numpy中所用过的一些函数…