文档章节

大津法---OTSU算法

moki_oschina
 moki_oschina
发布于 2016/11/24 14:38
字数 791
阅读 41
收藏 0

OpenCV的二值化操作中,有一种“大津阈值处理”的方法,使用函数cvThreshold(image,image2,0,255,CV_THRESH_OTSU) 实现,该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起作用。OTSU算法

OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

设灰度图像灰度级是L,则灰度范围为[0,L-1],利用OTSU算法计算图像的最佳阈值为:
t = Max[w0(t) * (u0(t) - u)^2 + w1(t) * (u1(t) - u)^2)]
其中的变量说明:当分割的阈值为t时,w0为背景比例,u0为背景均值,w1为前景比例,u1为前景均值,u为整幅图像的均值。
使以上表达式值最大的t,即为分割图像的最佳阈值。

以下是一段在OpenCV中实现的C语言程序,即一个使用OTSU算法提取图像阈值的函数,输入参数为一个图像指针,返回分割该图像的最佳阈值。

其中的变量说明:当分割的阈值为t时

w0为背景像素点占整幅图像的比例

u0为w0平均灰度

w1为前景像素点占整幅图像的比例

u1为w1平均灰度

u为整幅图像的平均灰度

公式:g = w0*pow((u-u0),2) + w1*pow((u-u1),2)

 

int MyAutoFocusDll::otsuThreshold(IplImage *frame)  
{  
 const int GrayScale = 256;
 int width = frame->width;  
 int height = frame->height;  
 int pixelCount[GrayScale];  
 float pixelPro[GrayScale];  
 int i, j, pixelSum = width * height, threshold = 0;  
 uchar* data = (uchar*)frame->imageData;  //指向像素数据的指针

 for(i = 0; i < GrayScale; i++)  
 {  
  pixelCount[i] = 0;  
  pixelPro[i] = 0;  
 }  
 
 //统计灰度级中每个像素在整幅图像中的个数  
 for(i = 0; i < height; i++)  
 {  
  for(j = 0;j < width;j++)  
  {  
   pixelCount[(int)data[i * width + j]]++;  //将像素值作为计数数组的下标
  }  
 }  
 
 //计算每个像素在整幅图像中的比例  
 float maxPro = 0.0;
 int kk=0;
 for(i = 0; i < GrayScale; i++)  
 {  
  pixelPro[i] = (float)pixelCount[i] / pixelSum;  
  if( pixelPro[i] > maxPro )
  {
   maxPro = pixelPro[i];
   kk = i;
  }
 }  


 //遍历灰度级[0,255]  
 float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;  
 for(i = 0; i < GrayScale; i++)     // i作为阈值
 {  
  w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;  
  for(j = 0; j < GrayScale; j++)  
  {  
   if(j <= i)   //背景部分  
   {  
    w0 += pixelPro[j];  
    u0tmp += j * pixelPro[j];  
   }  
   else   //前景部分  
   {  
    w1 += pixelPro[j];  
    u1tmp += j * pixelPro[j];  
   }  
  }  
  u0 = u0tmp / w0;  
  u1 = u1tmp / w1;  
  u = u0tmp + u1tmp;  
  deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);  
  if(deltaTmp > deltaMax)  
  {  
   deltaMax = deltaTmp;  
   threshold = i;  
  }  
 }  
 
 return threshold;  

 

http://blog.csdn.net/guoyk1990/article/details/7606032

本文转载自:http://blog.csdn.net/akunainiannian/article/details/27565899

共有 人打赏支持
moki_oschina
粉丝 25
博文 191
码字总数 39962
作品 0
成都
程序员
私信 提问
OpenCV2.4-使用P参数法二值化

二值化是图像处理的基本操作,OpenCV提供了: 固定阈值二值化. --threshold(... ...,CVTHRESHBINARY); 最大类间方差法(大津法OTSU)二值化. --threshold(... ...,CVTHRESHOTSU); 局部自适应二值...

csm1972385274
04/21
0
0
使用Numpy和Opencv完成图像的基本数据分析(Part IV)

图像 本文是使用python进行图像基本处理系列的第四部分,在本人之前的文章里介绍了一些非常基本的图像分析操作,见文章《使用Numpy和Opencv完成图像的基本数据分析Part I》、《使用Numpy和O...

【方向】
10/10
0
0
手写数字识别系统之图像分割

背景 本文,主要介绍我之前在学校时候,研究的一些跟手写数字识别相关的技术心得,主要涉及:数字图像处理、特征提取、神经网络等等相关的一些技术。。 虽然很多用到的还是网上现有的比较成熟...

ruki
2016/07/30
184
0
相似图片搜索的原理(二)

二年前,我写了《相似图片搜索的原理》,介绍了一种最简单的实现方法。 昨天,我在isnowfy的网站看到,还有其他两种方法也很简单,这里做一些笔记。 一、颜色分布法 每张图片都可以生成颜色分...

阮一峰
2013/03/31
0
0
【OpenCV3.3】检测图像中的身份证区域

假设现有一些含身份证前景以及不确定背景的图像,想通过计算机将身份证区域检测出来,实现诸如用户拍照定位提示、背景分离等业务,用OpenCV该如何做呢?如果输入图像前景和背景同时具有一定区...

wjf1997
2017/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
1
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
5
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
4
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
17
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部