预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Otsu算法(大律法或最大类间方差法) 一、Otsu最大类间方差法原理 利用阈值将原图像分成前景,背景两个图象。 前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度 后景:用n2,sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度 当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准,而在otsu算法中这个衡量差别的标准就是最大类间方差(英文简称otsu,这也就是这个算法名字的来源),在本程序中类间方差用sb表示,最大类间方差用fmax 关于最大类间方差法(otsu)的性能: 类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。 当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。 最大类间方差法(otsu)的公式推导: 记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。 则图像的总平均灰度为:u=w0*u0+w1*u1。 前景和背景图象的方差:g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1)*(u0-u1),此公式为方差公式。 可参照概率论课本上面的g的公式也就是下面程序中的sb的表达式。当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度t是最佳阈值sb=w1*w2*(u1-u0)*(u0-u1) 算法实现1: unsafepublicintGetThreshValue(Bitmapimage) { BitmapDatabd=image.LockBits(newRectangle(0,0,image.Width,image.Height),ImageLockMode.WriteOnly,image.PixelFormat); byte*pt=(byte*)bd.Scan0; int[]pixelNum=newint[256];//图象直方图,共256个点 bytecolor; byte*pline; intn,n1,n2; inttotal;//total为总和,累计值 doublem1,m2,sum,csum,fmax,sb;//sb为类间方差,fmax存储最大方差值 intk,t,q; intthreshValue=1;//阈值 intstep=1; switch(image.PixelFormat) { casePixelFormat.Format24bppRgb: step=3; break; casePixelFormat.Format32bppArgb: step=4; break; casePixelFormat.Format8bppIndexed: step=1; break; } //生成直方图 for(inti=0;i<image.Height;i++) { pline=pt+i*bd.Stride; for(intj=0;j<image.Width;j++) { color=*(pline+j*step);//返回各个点的颜色,以RGB表示 pixelNum[color]++;//相应的直方图加1 } } //直方图平滑化 for(k=0;k<=255;k++) { total=0; for(t=-2;t<=2;t++)//与附近2个灰度做平滑化,t值应取较小的值 { q=k+t; if(q<0)//越界处理 q=0; if(q>255) q=255; total=total+pixelNum[q];//total为总和,累计值 } //平滑化,左边2个+中间1个+右边2个灰度,共5个,所以总和除以5,后面加0.5是用修正值 pixelNum[k]=(int)((float)total/5.0+0.5); } //求阈值 sum=csum=0.0; n=0; //计算总的图象的点数和质量矩,为后面的计算做准备 for(k=0;k<=255;k++) { //x*f(x)质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),sum为其总和 sum+=(double)k*(double)pixelNum[k]; n+=pixelNum[k];//n为图象总的点数,归一化后就是累积概率 } fmax=-1.0;//类间方差sb不可能为负,所以fmax初始值为-1不影响计算的进行 n1=0; for(k=0;k<255;k++)//对每个灰度(从0到255)计算一次分割后的类间方差sb { n1+=pixelNum[k];//n1为在当前阈值遍前景图象的点数 if(n1==0){continue;}//没有分出前景后景 n2=n-n1;//n2