zoukankan      html  css  js  c++  java
  • 图像处理算法2——Otsu最佳阈值分割法http://blog.csdn.net/xiaqunfeng123/article/details/17121195

    http://blog.csdn.net/xiaqunfeng123/article/details/17121195Otsu法是1979年由日本大津提出的。该方法在类间方差最大的情况下是最佳的,即统计鉴别分析中所用的度量。Otsu方法有一个重要的特性,就是它完全以在一幅图像的直方图上执行计算为基础,而直方图是很容易得到的一维阵列。

        具体的公式推理及公式细节就不说了,详见 Conzalez 那本书,我是第三版的,在P.479——P.482 上面。

    给出具体步骤如下:

    1、计算输入图像的直方图,并归一化。

    2、计算累积均值mu,以及全局灰度均值。

    3、计算被分到类1的概率q1,和被分到类2的概率q2。

    4、用公式计算类间方差,sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2)

    5、循环寻找类间方差最大值,并记下此时的阈值,即为最佳阈值。

    6、利用最佳阈值进行图像阈值化。

    关于otsu部分的程序代码如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. double getThreshVal_Otsu_8u( const Mat& _src )  
    2. {  
    3.     Size size = _src.size();  
    4.     const int N = 256;  
    5.     int i, j, h[N] = {0};  
    6.     unsigned char* src;  
    7.     //直方图统计  
    8.     for( i = 0; i < size.height; i++ )  
    9.     {  
    10.         src = _src.data + _src.step*i;  
    11.         j = 0;  
    12.         for(j = 0; j < size.width; j++ )  
    13.             h[src[j]]++;  
    14.     }  
    15.     //像素平均值  
    16.     double mu = 0, scale = 1./(size.width*size.height);  
    17.     for( i = 0; i < N; i++ )  
    18.     {  
    19.         mu += i*(double)h[i];//累加均值  
    20.     }  
    21.     mu *= scale;//平均  
    22.   
    23.     double mu1 = 0, q1 = 0;//q1 ,q2 为类1和类2的概率累积和,mu1=mg*q1  
    24.     double p_i, q2, mu2, sigma;  
    25.     double max_sigma = 0, max_val = 0;  
    26.     //循环求取最大阈值  
    27.     for( i = 0; i < N; i++ )  
    28.     {  
    29.         p_i = h[i]*scale;//直方图归一化  
    30.         mu1 *= q1;  
    31.         q1 += p_i;  
    32.         q2 = 1. - q1;  
    33.         mu1 = (mu1 + i*p_i)/q1;  
    34.         mu2 = (mu - q1*mu1)/q2;  
    35.         sigma = q1*q2*(mu1 - mu2)*(mu1 - mu2);//类间方差  
    36.         if( sigma > max_sigma )  
    37.         {  
    38.             max_sigma = sigma;  
    39.             max_val = i;//记下使类间方差最大的阈值  
    40.         }  
    41.     }  
    42.     return max_val;//返回阈值  
    43. }  


    注意,上面这部分传递的图像是 Mat 类型的,和 Iplimage 类型在图像参数部分写法上有一点区别,注意区分开来

    显示结果如下:

  • 相关阅读:
    Python类属性的延迟计算
    解析Python编程中的包结构
    解析Python编程中的包结构
    Python查询Mysql时返回字典结构的代码
    VS2010中如何查看DLL的导出接口
    C++ 简单的日志类
    ilmerge工具合并多个DLL或EXE
    基于InstallShield2013LimitedEdition的安装包制作
    c# 操作注册表
    Source Insight 常用设置和快捷键大全
  • 原文地址:https://www.cnblogs.com/newcoder/p/4232176.html
Copyright © 2011-2022 走看看