前言

图像阈值处理在图像分割中处于核心地位!本节将重点介绍一些常见的阈值处理方法。

 

一、基本的全局阈值处理

选取阈值往往是通过直方图来选择的,一方面我们可以人为的设置一个阈值进行一次二值化处理达到全局阈值处理的目的,但这样的阈值处理往往效果并不好;另一方面我们也可以先人为的设置一个阈值,之后通过迭代的方法得到最合适的阈值再进行二值化处理,这种方法显然比前者要更加适合。

二、使用步骤

1.为全局阈值选择一个初始值T(通常我们选择矩阵的均值作为初始值)

2.使用T分割图像,产生两组像素:所有的灰度值均大于T的像素组G1以及所有的灰度值均小于T的像素组G2。

3.分别计算G1和G2中像素的平均灰度值m1,m2

4.令T=(m1+m2)/2

5.重复步骤234直到得到的相邻的T的差值小于预定义的▲T值为止

6.使用imb2bw进行图像分割,若为8比特图像则应采用T/255

三、代码及工作区展示

I1=imread('zhiwen.tif');
count=0;
T=mean2(I1);%求矩阵的均值
done =false;
%以下为迭代过程
while ~done
    count=count+1;
    g=I1>T;
    Tnext=0.5*(mean(I1(g))+mean(I1(~g)));%分别计算两个区域各自的像素的灰度平均值
    done =abs(T-Tnext)<0.5;%设置预定义值为0.5
    T=Tnext;
end
g=im2bw(I1,T/255);%图像为8比特
subplot(131),imshow(I1),title('原图');
subplot(132),imhist(I1),title('原图直方图');
subplot(133),imshow(g),title('全局阈值分割图');

全局阈值分割的迭代法python算法_迭代

四、结果展示及分析

全局阈值分割的迭代法python算法_迭代_02

根据图像结果可以看到最终得到的全局阈值处理图像相较于原本图像对比度更加明显,也更加清晰,阈值处理达到了预期效果。

根据工作区我们可以看到最终T=160.0102,count=4,这证明我们一共进行了四次迭代才满足了预定义值0.5,最终的T值在直方图中来看确实将两个峰值左右分开,如果采用肉眼观察直接确定几乎是不可能取到这么合适的值的。

五、Otsu方法进行最佳全局阈值处理

在原图的直方图分布并没有显著的波谷,或者说仅存在一波峰甚至没有波峰时,采用上述的方法进行迭代分类效果并不理想,这个时候我们可以采用Otsu方法进行最佳全局阈值处理。Otsu方法采用了类间方差最大化的思想,也就是说方差越大,越接近于正确分割图像的阈值,而这种最佳测度完全基于直接由图像直方图得到的参数。

使用matlab中的工具箱函数graythresh可以实现Otsu方法进行最佳全局阈值处理,语法为:

                                                                                                                                   [T,SM]=graythresh(f)

其中f是输入的原图,T就是我们希望得到的阈值,SM是可分性测度。最后我们仍然采用im2bw进行图像分割。

六、代码展示

I1=imread('cell.tif');
%使用Otsu方法分割图像
[T,SM]=graythresh(I1);%采用Otsu方法得到阈值T
I2=im2bw(I1,T);%按照给定的阈值T进行图像分割
subplot(221),imshow(I1),title('原图');
subplot(222),imhist(I1),title('原图直方图');
subplot(223),imshow(I2),title('Otsu方法阈值图');

%使用基于全局阈值处理
count=1;
T=mean2(I1);
done=false;
while ~done
    count=count+1;
    g=I1>T;
    Tnext=0.5*(mean(I1(g))+mean(I1(~g)));
    done=abs(T-Tnext)<0.05;
    T=Tnext;
end
I3=im2bw(I1,T/255);
subplot(224),imshow(I3),title('基于全局的阈值处理图');

在这里我们对同样一幅图像分别进行了基于全局的阈值处理和Otsu方法的最佳全局阈值处理进行比较。

七、结果展示及分析

全局阈值分割的迭代法python算法_迭代_03

可以看到Otsu方法的分割明显要优于基本的全局阈值处理,Otsu方法成功地将细胞边界分割了出来,实现了图像分割的预定目标。

根据图像直方图我们可以发现,在没有明显的波谷时,采用基本的全局阈值处理并不能得到预想的图像分割效果,这是因为阈值T不能通过迭代很好的确定导致的,这时我们就要采用Otsu方法进行图像分割。


总结

阈值处理在图像分割中占有非常重要的地位,一般而言我们可以选择的阈值处理方式有两种,分别是基本的全局阈值处理和利用Otsu方法进行最佳全局阈值处理。前者采用了迭代的思想进行阈值处理,后者则利用了方差最大化的思想进行处理。当图像直方图中具有明显的波谷或者说波峰之间的分界十分明显时,采用基本的全局阈值处理往往可以很好的解决问题;但是如果直方图不能满足上述需求,则应采用Otsu方法进行最佳的全局阈值处理。