计算机视觉
图像处理

基于Otsu算法的图像自适应阈值分割

在图像处理实践中,将灰度图转化为二值图是非常常见的一种预处理手段。在Matlab中,可以使用函数BW = im2bw(I, level)来将一幅灰度图 I,转化为二值图。其中,参数level是一个介于0~1之间的值,也就是用于分割图像的阈值。默认情况下,它可取值是0.5。

现 在问题来了,有没有一种根据图像自身特点来自适应地选择阈值的方法呢?答案是肯定的!我们今天就来介绍其中最为经典的Otsu算法(或称大津算法)。该算 法由日本科学家大津展之(Nobuyuki Otsu)于1979年提出。这个算法看似简单,却与统计分析中的“方差分析”方法有很深的渊源。有兴趣的读者也可以参考算法原文《A threshold selection method from gray-level histograms》(在线浏览地址:http://wenku.baidu.com/view/996e972d7375a417866f8f5d) 我们今天在介绍该算法原理的基础之上,通过简单的Matlab代码来演示它的实现。

Matlab 的帮助信息中指出:To compute the level argument,you can use the function graythresh. The graythresh function uses Otsu’s method。可见,函数graythresh()就是Matlab中的大津法实现。如果对Otsu算法的原理并不感兴趣,完全可以直接调用graythresh()函数,而无需过多关系其中的技术细节。

在大津法中,我们定义组内方差为

通过选择使得上述组内方差最小化时的阈值 t,就可以使得图像中的前景和背景尽可能的被区别开(假设我们将最终图像里被分开的两部分称为前景和背景)。w0和w1分别是一个像素可能属于前景或背景的概率,而 σ 表示两个类别的方差。如果一个图像的直方图有L个等级(一般L=256),那么在给定阈值 t的情况下,w0和w1分别定义为

大津展之证明最小化组内方差(intra-class variance)与最大化组间方差(inter-class variance)是等价的,于是有

又因为(其中 μ 表示均值或期望)

可以推出

这个证明仅仅涉及一些算术上的推导,我简单演示如下

最后我们给出在Matlab中实现的代码,这个代码的最初版本来自维基百科,为了与前面的公式中的标记相一致,我略有修改。

  1. function level = otsu(histogramCounts, total)
  2. sum0 = 0;
  3. w0 = 0;
  4. maximum = 0.0;
  5. total_value = sum((0:255).*histogramCounts’);
  6. for ii=1:256
  7.     w0 = w0 + histogramCounts(ii);
  8.     if (w0 == 0)
  9.         continue;
  10.     end
  11.     w1 = total – w0;
  12.     if (w1 == 0)
  13.         break;
  14.     end
  15.     sum0 = sum0 +  (ii-1) * histogramCounts(ii);
  16.     m0 = sum0 / w0;
  17.     m1 = (total_value – sum0) / w1;
  18.     icv = w0 * w1 * (m0 – m1) * (m0 – m1);
  19.     if ( icv >= maximum )
  20.         level = ii;
  21.         maximum = icv;
  22.     end
  23. end
  24. end

上述函数中的参数histogramCounts是图像的直方图, total图像的总像素数。来看下面这段调用上述函数的测试代码。

  1. >> img = imread(‘otsus_test.jpg’);
  2. >> [counts x] = imhist(img);
  3. >> [m n] = size(img);
  4. >> level = otsu(counts, m*n);
  5. >> output = img;
  6. >> output(output<level) = 0;
  7. >> output(output>=level) = 255;
  8. >> imshow(output)

首先给出原始图像

然后是基于Otsu算法获取的二值图

转载注明来源:CV视觉网 » 基于Otsu算法的图像自适应阈值分割

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 4

评论前必须登录!