300 likes | 565 Views
基于遗传算法的图像分割 阈值选取的实现. 导师:师黎 姓名:贾红斌. 组织结构. 引言 Otsu 算法 基于 GA 的阈值选取方法 实验结果与结论. 一、引言. 图像分割 是计算机图像处理与分析中的一个经典问题 , 它利用不同的图像特征将原图分成各自独立的区域 , 从而抽取出感兴趣的目标。 图像分割的好坏直接影响图像特征的提取、图像识别的精度。 图像分割方法的正确性和自适应性在一定程度上影响着目标检测和识别的智能化程度,其分割速度影响着实用性。.
E N D
基于遗传算法的图像分割阈值选取的实现 导师:师黎 姓名:贾红斌
组织结构 • 引言 • Otsu算法 • 基于GA 的阈值选取方法 • 实验结果与结论
一、引言 • 图像分割是计算机图像处理与分析中的一个经典问题,它利用不同的图像特征将原图分成各自独立的区域,从而抽取出感兴趣的目标。 • 图像分割的好坏直接影响图像特征的提取、图像识别的精度。 • 图像分割方法的正确性和自适应性在一定程度上影响着目标检测和识别的智能化程度,其分割速度影响着实用性。
Otsu方法(最大类间方差法)是利用图像中的灰度直方图,以目标与背景之间的方差最大而动态的确定图像分割门限值,是经典的非参数、无监督自适应阈值选取方法。它不需要其他先验知识,因而应用范围很广,至今仍是最常用的图像分割方法之一。Otsu方法(最大类间方差法)是利用图像中的灰度直方图,以目标与背景之间的方差最大而动态的确定图像分割门限值,是经典的非参数、无监督自适应阈值选取方法。它不需要其他先验知识,因而应用范围很广,至今仍是最常用的图像分割方法之一。 • 最大类间方差法是图像分割中一种重要的方法,它具有很多的优点,但同时也有弱点:计算需大量的时间。因此,需要引入优化算法, 可将遗传算法用于解决图像分割问题中。
遗传算法是20 世纪70 年代由J . H. Holland 教授首先提出的,其思想源于生物进化论,对包含可能解(个体) 的种群反复使用基于遗传学的操作,生成新的种群,同时搜索最优解,使问题的解不断“进化”,以求得满足要求的最优解。 • 遗传算法的基本思想是模拟自然选择和自然遗传过程中发生的繁殖、交配和突变现象,由此构成了遗传算法的三个基本算子:复制、交叉和变异。
遗传算法在几个基本方面不同于传统优化方法。可总结为如下几点:遗传算法在几个基本方面不同于传统优化方法。可总结为如下几点: (1)遗传算法运算的是解集的编码,而不是解集本身; (2)遗传算法的搜索始于解的一个种群,而不是单个解; (3)遗传算法只使用报酬信息(适值函数),而不使用导数或其他辅助知识; (4)遗传算法采用概率的,而不是确定的状态转移规则。
二、Otsu算法 • 对于灰度图像,记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。图像的总平均灰度为: g(t)=w0*(u0-u)^2+w1*(u1-u)^2 (1) 其中u为总均值。从最小灰度值到最大灰度值遍历t,当t使得 g(t)=w0*(u0-u)^2+w1*(u1-u)^2 =w0*w1*(u1-u0)*(u1-u0)(推导得) 最大时t即为分割的最佳阈值。 即 t*=Arg max g(t)
对Otsu算法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为 w0,背景取值u1,概率为w1,总均值为u,根据方差的定义即得该式。因方差是灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大, 当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小。 • 由Otsu算法的准则函数过程可以看出,由于最佳阈值的求解是通过穷尽的搜索方法得到的,因此计算量很大。
int CImgSegment::OtusFun(int histArray[256]) { float u0,u1; float w0,w1; int count0; int t, maxT; float fcha, maxfcha=0; //方差及最大方差
int i; • int sum=0; • for(i=0;i<256;i++) sum = sum+histArray[i]; • for(t=0;t<255;t++){ • //计算阈值为t时,c0组的均值和产生的概率
u0=0; • count0=0; • for(i=0; i<=t;i++){ • u0 += i*histArray[i]; • count0 += histArray[i]; • } • u0=u0/count0; • w0=(float)count0/sum; • //计算阈值为t时,c1组的均值和产生的概率 • u1=0;
u1+=i*histArray[i]; • u1=u1/(sum-count0); • for(i=t+1; i<256;i++) • w1=1-w0; • fcha=w0*w1*(u1-u0)*(u1-u0);
if(fcha>maxfcha) • { • maxfcha=fcha; • maxT=t; • } • } • return maxT; //返回最佳阈值 • }
三、基于GA 的阈值选取方法 • 利用遗传算法寻找最优阈值的步骤如下: Step1在 0~255之间随机产生 N个数X11~X18,并将它们按二进制形式进行编码,形成初始种群; Step2根据下式计算群体中各个体的适应度值g(t),其中t有二进制形式解码值; g(t)=w0*w1*(u1-u0)*(u1-u0);(1)
Step3根据轮转赌法在X11~X18中选取用于繁殖的个体X’11~X’18;Step3根据轮转赌法在X11~X18中选取用于繁殖的个体X’11~X’18; Step4在X’11~X’18 中按相同概率选出 2个个体, 并将它们按事先设定的交叉概率Pc 进行重组运算,产生 2个新个体,重复这一过程,直至形成新种群N个数X”11~X”18
Step5根据设定的变异概率Pm 随机地对X”11~X”18中任一个体中任一位码进行取反操作,从而产生新一代种群X21~X28; Step6检验停机准则是否满足,若满足,则停止GA运算转向步骤(1);否则转向步骤(2 ); Step7将最后一代的群体中适应度最大的个体作为所寻求的最优结果,并将其反编码成0~255 之间的灰度值t ,即为所求的阈值t。 • 运行参数 设定群体中个体数 N=10,交叉概率Pc=0.8 ,变异概率Pm=0.02,最大迭代次数G=50。 • 遗传算法主要程序如下:
选择算子函数: • viod CImgSegment::SelectOper() • { • for(i=0; i<11; i++) • f[i]= fitnessfun(s[i]); • for(i=0; i<11; i++) • sum+=f[i]; • for(i=0; i<11; j++) • f[i]=f[i]/sum;
for(i=1;i<11;i++) • f[i]=f[i-1]+f[i]; • for(i=1;i<11;i++){ • p=rand( ); • j=0; • while(p>f[j]) • j++; • t[i]=s[j]; • } • for(i=0;i<11;i++) • s[i]=t[i]; • }
交叉算子函数: • viod CImgSegment::CrossoverOper() • { • for(i=1;i<11;i=i+2) { • p1=rand(); • if(p1<pc) { • p2=rand(); • swap(s[i], s[i+1], p2*8); • } • } • }
变异算子函数: viod CImgSegment::MutationOper() { for(i=1;i<11;i++) { p1=rand(); if(p1<pm) { p2=rand(); mutation(s[i], p2*8); } } }
int CImgSegment::Ga(CDib *pDib) • { • struct individual *temp; • zhifantu(pDib); • int y; • int nThreshold=0; • int x; //遍历图象的横坐标 • CSize sizeImage = pDib->GetDimensions();//图象的长宽大小
int nWidth = sizeImage.cx ; • int nHeight = sizeImage.cy ; • CSize sizeImageSave = pDib->GetDibSaveDim();//图像在计算机在存储中的实际大小 • int nSaveWidth = sizeImageSave.cx; //图像在内存中每一行象素占用的实际空间
LPBYTE pImageData = pDib->m_lpImage;/ /图像数据的指针 • char *malloc(); • maxruns=1; • for(run=1; run<=maxruns; run++) • { • initialize(pDib); • for(gen=0; gen<maxgen; gen++) • { • generation();/* 产生新一代 */ • statistics(newpop); /* 计算新一代种群的适应度统计数据 */ • report();/* 输出新一代统计数据 */
temp = oldpop; • oldpop = newpop; • newpop = temp; • } • freeall(); • } • nThreshold=(unsigned char )bestfit.threshold; • //遍历图象的纵坐标 • for(y=0; y<nHeight ; y++ ) • for(x=0; x<nWidth ; x++ ) • {
if( *(pImageData+y*nSaveWidth+x)<nThreshold) • *(pImageData+y*nSaveWidth+x) = 0; • else *(pImageData+y*nSaveWidth+x)=255; • } • return nThreshold; • }
四、实验结果与结论 • 试验结果表明,基于GA算法的Otsu算法与传统的Otsu算法得到的结果完全一致。 • 遗传算法作为一种优化算法用于图像分割时,可以缩短寻找阈值的时间,从而有利于计算机视觉的后续处理。 • 算遗传法作为一种并行算法,提高速度的潜力是很大的,将其用于图像处理,并与并行计算机相结合将会有更广阔的前景。
注意1 当图像中只有0和255两种灰度值时,程序会出现如上图所示的情况。 注意2 运行参数对遗传算法的影响:运行参数设定不同影响算法的运行时间。数据量较小时会出现运遗传算法运行时间大于传统算法的运行时间的情况。