社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习小白,还不快pick一下——【视觉与图像:阈值分割】

天池大数据科研平台 • 5 年前 • 943 次点击  

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


今天周五了!

今天还不下雨!!

今天又可以更新了!!!


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


文章交代:

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

推荐人群:

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

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

阈值分割

01
目标


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

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


02
固定阈值分割


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


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


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

  • 参数2:设定的阈值

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

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


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


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


03
自适应阈值


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



  • 参数1:要处理的原图

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

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

  1. ADAPTIVE_THRESH_MEAN_C:小区域内取均值

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

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

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

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


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


04
Otsu阈值


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

好吧,我知道激起了你的兴趣~ 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)


1.什么是双峰图片


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


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


2.代码示例


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

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



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


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


Otsu算法详解


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


  • T:分割阈值

  • N0:前景像素点数

  • N1:背景像素点数

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

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

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

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

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

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

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



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

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

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

‍‍此时,我们定义一个前景μ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的方差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);">g

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


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



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

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

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


点击下方图片即可阅读

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


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


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

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

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


👇“阅读原文”搬运至pc端观看更嗨森!

听说戳了的人都👇


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/TDkDmVLixW
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29074
 
943 次点击