基本全局阈值处理
选取阈值的一种方法就是图像直方图的视觉检测。例如,图10-12(a)中的直方图有两个截然不同的模式;很容易选择阈值T来分开它们。选择T的另一个方法是反复实验,选取不同的阈值,直到观测者觉得产生了较好的结果为止,这在交互环境下特别有效。例如,这种方法允许使用者通过widget(图形控制)改变阈值,就像游标一样,可以立即看见结果。
通常,在图像处理中首选的方法是使用一种能基于图像数据自动地选择阈值的算法,为了自动选阈值,下列迭代过程采用的就是这样的方法:
(1) 针对全局阈值选择初始估计值T。
(2) 用T分割图像。这会产生两组像素:G1由所有灰度值大于T的像素组成,G2由所有灰度值小于等于T的像素组成。
(3) 分别计算G1、G2区域内的平均灰度值m1和m2。
(4) 计算出新的阈值:
(5) 重复步骤(2)~(4),直到在连续的重复中,T的差异比预先设定的参数△T小为止。
(6) 使用函数im2bw分割图像:
- g = im2bw(f, T/den)
其中,den是整数(例如一幅8比特图像的255),是T/den比率为1的数值范围内的最大值,正如函数im2bw要求的那样。
在速度成为重要问题时,参数△T用于控制迭代次数。通常,△T越大,算法执行的迭代次数越少。这可以得到证明,假如初始阈值在图像中的最大和最小灰度值之间选择(平均图像灰度对T来说是不错的选择),那么算法在有限的步数内收敛。根据分割,在涉及物体和背景的直方图模式之间有相当清楚的谷的情况下,算法会工作得很好。我们以下边的例子来说明在MATLAB中如何执行这个过程。
例10.7 计算全局阈值
刚才讨论的基本迭代方法可按如下方式来执行,其中的f是图10-13(a)中的图像:
- >> count = 0;
- >> T = mean2(f);
- >> done = false;
- >> while ~done
- countcount = count + 1;
- g = f > T;
- Tnext = 0.5*(mean(f(g)) + mean(f(~g)));
- done = abs(T - Tnext) < 0.5;
- T = Tnext;
- end
- >> count
- count =
- 2
- >> T
- T =
- 125.3860
- >> g = im2bw(f, T/255);
- >> imshow(f) % Fig. 10.13(a).
- >> figure, imhist(f) % Fig. 10.13(b).
- >> figure, imshow(g) % Fig. 10.13(c).
算法仅需两步迭代就可收敛,并且得到的阈值接近灰度级的中点。可以期待清晰的分割,因为直方图中的模式之间有很宽的分开度。