利用OpenCV 2.2 的Python接口实现Ostu(大津法)获取阈值

OpenCV(版本2.2)是啥不说了你懂的。其实本文只是使用OpenCV计算了一个直方图。完全可以写Python代码实现。

Python(版本是2.7)是啥也不说你也懂的。

 

什么是大津法?

请注意是大“津”法,不是大“律”法!我第一看到的时候阴差阳错的看成了大“律”法,然后还在百度和谷歌上溜了一圈,居然还找到了很多资料,后来在琢磨Ostu四个字母的时候发现,Ostu是日本的一个县,叫大津县,所以这里应当是“大津法”。

 

大津法,又叫最大类间方差法,简称Otsu,是由日本学者大津于1979年提出的,是一种自适应的阈值确定方法。按图像的灰度特性,将图像分成两个部分,称之为部分0和部分1(即通常意义的背景与目标),两个部分的类间方差越大,说明构成图像的两部分的差别越大,也就是说图片的背景和目标的差别越大。

 

对于图像f(x,y),通过阈值t将图片分成两个部分,亮度小于t的称之为部分0,亮度大于等于t的称之为部分1。部分0像素点占整幅图像的比例为ω0,平均灰度μ0;部分1像素点占整幅图像的比例为ω1,平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。

则有

μ = ω0μ0+ω1μ1

g = ω0(μ0-μ)2+ω1(μ1-μ)2

 

将第一个式子带入到第二个式子我们可以得到

g=ω0ω1(μ0-μ1)2

通过遍历所有的亮度(一般是[0,255])求得所有的t值对应的g,最大的g出现的t就是Otsu算法得到的最佳阈值。

 

下面的Python程序展示了在OpenCV 2.2中使用Python 2.7计算Otsu最佳阈值,为了方便阅读,所有的ω使用w,μ使用u代替。

 

 

展示一下二值化的效果:

原图如下:

t=102时g取得最大值

为了节省空间,只传这么一个例子吧~

各位老师,文章中若有错误之处,恳请您斧正。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值