实验七:图像阈值分割实验
一、实验目的
1、掌握图像阈值分割的原理与方法;
2、理解各种自适应阈值选取方法的原理及编程方法;
3、掌握利用MATLAB语言,编程实现图像阈值分割算法,且分析比较分割结果。 4、了解图像分割的应用价值。 二、实验设备:
1、PC机或笔记本电脑,Windows操作系统;
2、安装Matlab与VS软件,准备实验相关图像或M文件;
3、按照如下实验内容与步骤,编写相应Matlab程序,完成实验任务。 三、实验原理
所谓图像阈值分割就是将图像上的像素点的灰度值设置为0或255,从而将整个图像呈现出明显的黑白效果,其具体方法是:将256个亮度等级的灰度图像通过选取适当的阈值而获得仍然可以反映图像整体和局部特征的二值化图像。
设I(x,y)是一幅M*N像素的灰度图像,其中x、y图像中的二维坐标位置,T为设定的阈值。然后,对所有灰度值大于或等于阀值的像素被判定为属于特定物体,其灰度值置为255,即当I(x,y)>T时,二值图对应像素点B(x,y)=255;反之,这些像素点被排除在物体区域以外,二值图对应的像素点B(x,y)=0,表示背景或者例外的物体区域。如果我们用f(x, y)表示变换前的灰度图像,g(x, y)表示变换后的二值图像,T为阈值,则相应的阈值二值化变换公式为:
ì?255
g(x,y)=í
??0
f(x,y)3Tf(x,y) (19.1) 在变换公式中,取255是为了实验上能方便地将整个图像呈现出明显的黑白效果,因为灰度值0和1分别不出来。若在实际应用中不这样取值,它们的明暗差异是不大的,甚至是区分不开的。 在阈值二值化过程中,分割阈值T可以说是图像阈值分割的重要参数,过高的阈值会导致一些真实边缘的丢失,过低的阈值又会产生一些无谓的虚假边缘。目前,相关研究者已经对二值化方法做了大量工作,并提出了几十种不同的图像阈值分割方法,如前言所述,阈值选取方法主要分为两类,即全局阈值法和局部阈值法。 下面介绍几种基本的阈值选取方法: 1、双峰法 在一些简单的图像中,物体的灰度分布比较有规律,背景与各个目标在图像的直方图各自形成一个波峰,即目标、背景区域与波峰一一对应,每两个波峰之间形成一个波谷。那么,选择双峰之间的波谷所代表的灰度值T作为阈值,即可实现两个区域的分割。如图19.1所示。相应的变换公式为: ì(白)?255 g(x,y)=í (黑)??0 2、P参数法 f(x,y)3Tf(x,y) (19.2) 当不同区域(即目标)之间的灰度分布有一定的重叠时,双峰法的效果就很差。如果预先知道每个目标占整个图像的比例P,则可以采用P参数法进行分割。 33 P参数法的具体步骤可以如下描述,假设已知整个直方图中目标区域所占的比例为P1,算法步骤为: 1)计算图像的直方图分布P(t),其中t=0, 1, 2, …, 255,表示图像的灰度值; 2)从最低的灰度值开始,计算图像的累积分布直方图; P1(t)=?P(i),t=0,1,...,255 i=0t 3)计算阈值T, 有 T=argminP1(t)-P1,t=0,1,...,255 也就是说,阈值就是与P1最为接近的累积分布函数所对应的灰度值t。 因为在阈值选取过程中,需要预先知道目标区域的P值,因此称之为P参数法。 3、大津法 大津法也称为Otsu法或最大类间方差法。最大类间方差法是由Otsu 于1979 年提出的,是基于整幅图像的统计特性实现阈值的自动选取的,是全局二值化最杰出的代表方法之一。Otsu 算法的基本思想是用某一假定的灰度值t将图像的灰度分成两组,当两组的类间方差最大时,此灰度值t就是图像阈值分割的最佳阈值。 设图像有M 个灰度值,取值范围在0:M-1,在此范围内选取灰度值t,将图像分成两组G0和G1,G0包含的像素的灰度值在0~t,G1的灰度值在t+1:M-1,用N表示图像像素总数, Ni表示灰度值为i的像素的个数。 设每一个灰度值i出现的概率为pi=niN;假设G0和G1两组像素的个数在整体图像中所占百分比为W0,W1,两组平均灰度值为u0,u1,可得: t M-1 概率:w0=?pi,w1= i=0 t i=t+1 ?p i =1-w0 M-1 平均灰度值:u0=?ipi,u1= i=0 i=t+1 ?ip i 图像的总平均灰度为:u=w0′u0+w1′u1 间类方差为:g(t)=w0(u0-u)+w1(u1-u)=w0w1(u0-u1) 最佳阈值为:T=argmax(g(t)),即使得间类方差最大时所对应的t值 该算法也可这样理解:阈值T将整幅图像分成前景和背景两部分,当两类的类间方差最大时,此时前景和背景的差别最大,二值化效果最好。因为方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割阈值则意味着错分概率达到最小。 在实践中,大律法得到了广泛的应用,但是当物体目标与背景灰度差不明显时,会出现无法忍受的大块黑色区域,甚至会丢失整幅图像的信息。 4、最大熵阈值法 将信息论中的shannon熵概念用于图像分割,其依据是使得图像中目标与背景分布的信息量最大,即通过测量图像灰度直方图的熵,找出最佳阈值。 根据shannon熵的概念,对于灰度范围为0,1,2,…,M-1的图像,其直方图的熵定义为(仅仅是定义): 34 2 2 2 H=-?pilnpi (19.3) i=0 M-1 其中pi为灰度值为i的像素在整体图像中的概率。 设用阈值t将图像划分为目标O和背景B两类,他们的概率分布分别为: O区:pipt,i=0,1,...,t, 其中pt=?pi i=0t B区: pi ,i=t+1,...,M-1; 1-pi t M-1i=0 令Ht=-?pilnpt H=-?pilnpi i=0 则目标O和背景B的熵函数分别为: Ho(t)=-? i=0tt pipiHln=lnpt+t ptptpt HB(t)=-? pipH-Ht lni=ln(1-pt)+ 1-p1-p1-pi=0ttt 图像的总熵为 H(t)=HO(t)+HB(t)=lnpt(1-pt)+ HtH-Ht + pt1-pt 最佳阈值T为使得图像的总熵取得最大值:T=argmax(H(t))。 该方法的优点是:不需要先验知识,而且对于非理想双峰直方图的图像也可以进行较好的分割;缺点是:运算速度较慢不适合实时处理,并且仅仅考虑了像素点的灰度信息,没有考虑到像素点的空间信息,所以当图像的信噪比降低时分割效果不理想。 5、 迭代法(最佳阈值法) 迭代法是基于逼近的思想,迭代阈值的获取步骤可以归纳如下: 1)选择一个初始阈值T(j),通常可以选择整体图像的平均灰度值作为初始阈值,j为迭代次数,初始时j=0; (j)2)用T(j)分割图像,将图像分为2个区域C1(j) 和C2; 3)计算两区域的平均灰度值: u1()= j 1N1(j)f(x,y)?C1 ? (j)()f(x,y), u2= j 1 (j)N2 f(x,y)?C2 ? (j)f(x,y) (j)其中 N1(j)、N2为第j次迭代时区域C1和C2的像素个数,f(x,y)表示图像中(x,y)点的灰度值。 ()u1()+u2 4)再计算新的门限值,即 T(j+1)= 2 j j 5)令j=j+1,重复2)~4),直到T(j+1)与T(j)的差小于规定值。 四、练习内容 启动电脑,打开MATLAB编程编程环境,依次完成下列所有实验: 1、固定阈值图像分割实验。 n 在Matlab中,建立M文件Lab7_Test1.m,编写如下代码,实现图像阈值图像分割算法。代码如下: 35 clc; clear all; close all; Img=imread('barbara.bmp'); figure,subplot(1,2,1); imshow(Img); title('原始图像'); Th=128; %指定一个阈值 [H,W]=size(Img); for h=1:H f or w=1:W if (Img(h,w)>Th) BW(h,w)=255; else BW(h,w)=0; end end end subplot(1,2,2); imshow(uint8(BW)); title('分割结果'); 2、迭代式阈值选择图像分割实验。 f=imread('barbara.bmp'); subplot(1,2,1); imshow(f); title('原始图像'); f=double(f); T=(min(f(:))+max(f(:)))/2; done=false; i=0; while ~done r1=find(f<=T); r2=find(f>T); Tnew=(mean(f(r1))+mean(f(r2)))/2; done=abs(Tnew-T)<1; T=Tnew; i=i+1; end f(r1)=0; f(r2)=1; subplot(1,2,2); imshow(f); title('迭代阈值二值化图像'); 3、Otsu方法阈值选择图像分割实验。 以下程序实现的功能是:先用graythresh函数求取阈值,然后用此阈值将灰度图像二值化分割。 f=imread('lena.bmp'); subplot(2,2,1); imshow(f); title('原始图像'); T=graythresh(f); g=im2bw(f,T); subplot(2,2,2); imshow(g); title('Otsu方法二值化图像'); 五、实验内容及要求 36 1、在MATLAB中,严格完成上述实验内容,且分析比较实验结果; 2.参照上述程序,自己编程实现: 1)编写一个函数,实现Otsu方法自动选取分割阈值Th,用之来实现图像阈值分割; 2)编写一个函数,实现P参数法自动选取分割阈值Th,用之来实现图像阈值分割; 3)编写一个函数,实现最大熵阈值法自动选取分割阈值Th,用之来实现图像阈值分割; 4)编写一个函数,实现双峰法自动选取分割阈值Th,用之来实现图像阈值分割; 3、查阅相关资料,在VS2010环境,用OpenCV实现图像的阈值分割功能(如:固定阈值与自适应阈值),且分析与比较实验结果。 37