前言:安利Python来开发OpenCV的原因其实细心的小伙伴早在?【视觉与图像】Python+OpenCV教程入门篇就找到了想要的答案。(点蓝字即可打开)
”今天周五了!
今天还不下雨!!
今天又可以更新了!!!
先前小天邀请老王和大家聊到Python+OpenCV的第5波:颜色空间转换(点蓝字即可打开),那么接下来老王给同学们带来的是Python+OpenCV第6篇章:阈值分割,还不快收藏?住!
文章交代:
学习使用不同的阈值方法”二值化”图像
推荐人群:
初级入门、机器学习小白、技术爱好者
【图片可到文末?本节源码下载。】
阈值分割
01目标使用固定阈值、自适应阈值和Otsu阈值法”二值化”图像
OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()
固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。
cv2.threshold()用来实现阈值分割,ret是return value缩写,代表当前的阈值,暂时不用理会。函数有4个参数:
参数1:要处理的原图,*一般是灰度图
参数2:设定的阈值
参数3:最大阈值,一般为255
参数4:阈值的方式,主要有5种,详情:http://t.cn/EfZhnbq
下面结合代码理解下这5种阈值方式:
03自适应阈值Tips:很多人误以为阈值分割就是二值化。从上图中可以发现,两者并不等同,阈值分割结果是两类值,而不是两个值,所以教程开头我把二值化加了引号。
看得出来固定阈值是在整幅图片上应用一个阈值进行分割,它并不适用于明暗分布不均的图片。 cv2.adaptiveThreshold()自适应阈值会每次取图片的一小部分计算阈值,这样图片不同区域的阈值就不尽相同。它有5个参数,其实很好理解,先看下效果:
参数1:要处理的原图
参数2:最大阈值,一般为255
参数3:小区域阈值的计算方式
ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
参数4:阈值方式(跟前面讲的那5种相同)
参数5:小区域的面积,如11就是11*11的小块
参数6:最终阈值等于小区域计算出的阈值再减去此值
如果你没看懂上面的参数也不要紧,暂时会用就行,当然我建议你调整下参数看看不同的结果。
04Otsu阈值在前面固定阈值中,我们是随便选了一个阈值如127,那如何知道我们选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。Otsu阈值法就提供了一种自动高效的二值化方法,不过我们直方图还没学,这里暂时略过。
好吧,我知道激起了你的兴趣~ o( ̄▽ ̄)o,有能力的童鞋可以看下继续往下看番外篇~
05小结cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。 二值化跟阈值分割并不等同。针对不同的图片,可以采用不同的阈值方法。
06练习Otsu阈值是一种高效的二值化算法,请阅读(番外篇)?
引用
本节源码 http://t.cn/EfZcSIJ
Image Thresholding http://t.cn/EfZcHyc
番
外
大部分图像处理任务都需要先进行二值化操作,阈值的选取很关键,Otsu阈值法会自动计算阈值。
Otsu阈值法(日本人大津展之提出的,也可称大津算法)非常适用于双峰图片,啥意思呢?
1.什么是双峰图片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)
双峰图片就是指图片的灰度直方图上有两个峰值,直方图就是每个值(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μ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:
将前述的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阿里巴巴人工智能对抗算赛,约一波?
听说戳了的人都?