一维最大类间方差法
基于最大类间类内方差比法的图像分割

针对灰度图像,笔者打算根据如下的实验步骤进行实验仿真; 对于彩色图像,笔者打算分别将原图三通道提取出来,然后按照如下 的实验步骤分别对单通道分割,然后对处理后的三个通道进行整合, 得到新的分割图像。
四、实验步骤
1、给定一个初始阈值 Th=Th0,将图像分成 C1 和 C2 两类; 2、分别按下列公式计算两类中的方差σ1^2 和σ2^2,灰度均值 μ1 和μ2,以及图像的总体均值μ;
由于最大类间、类内方差比法是基于图像灰度分布的阈值方法。 数学模型如下:
设原图像为 f(x,y),经过分割处理后的图像为 g(x,y),g(x,y) 为二值图像,则有
g
(
x,
y)
1
0
f (x, y) Th f (x, y) Th
(3-1)
2、最大类间方差法与最大类间、类内方差比法的不同:
最大类间方差法又叫大津法,简称 OTSU。它是按图像的灰度特性, 将图像分成背景和目标 2 部分。背景和目标之间的类间方差越大,说 明构成图像的 2 部分的差别越大。它只需处理类间方差,在 Matlab 中 grathresh()即为最大类间方差函数,用来寻找阈值。
p1
N c2 N im age
(4 4)
4、计算类间方差σb^2=和类内方差σin^2;
b2 p1 (1 )2 p2 (2 )2
2 in
p1பைடு நூலகம்
2 1
p2
2 2
(4 5) (4 6)
5、选择最佳阈值 Th=Th*,使得图像按照该阈值分成 C1 和 C2 后,
满足两者方差比最大:
max
b=zeros(m,n);
%新建二维矩阵 b 用来显示分割后的图像
最大类间方差法

最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。
它是按图像的灰度特性,将图像分成背景和目标2部分。
背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。
因此,使类间方差最大的分割意味着错分概率最小.对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。
图像的总平均灰度记为μ,类间方差记为g。
假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:ω0=N0/ M×N (1)ω1=N1/ M×N (2)N0+N1=M×N (3)ω0+ω1=1 (4)μ=ω0*μ0+ω1*μ1 (5)g=ω0(μ0—μ)^2+ω1(μ1-μ)^2 (6)将式(5)代入式(6),得到等价公式: g=ω0ω1(μ0-μ1)^2 (7)采用遍历的方法得到使类间方差最大的阈值T,即为所求。
Otsu算法步骤如下:设图象包含L个灰度级(0,1…,L—1),灰度值为i的的象素点数为Ni ,图象总的象素点数为N=N0+N1+。
..+N(L-1).灰度值为i的点的概为:P(i) = N(i)/N.门限t将整幅图象分为暗区c1和亮区c2两类,则类间方差σ是t的函数:σ=a1*a2(u1—u2)^2 (2)式中,aj 为类cj的面积与图象总面积之比,a1 = sum(P(i))i—>t, a2 = 1—a1;uj为类cj的均值,u1 = sum(i*P(i))/a1 0->t,u2 = sum(i*P(i))/a2,t+1-〉L—1该法选择最佳门限t^ 使类间方差最大,即:令Δu=u1—u2,σb = max{a1(t)*a2(t)Δu^2} OTSU方法计算图像二值化的自适应阈值int otsu (unsigned char *image,int rows, int cols, int x0,int y0,int dx, int dy,int vvv){unsigned char *np;// 图像指针int thresholdValue=1; // 阈值int ihist[256]; // 图像直方图,256个点int i,j,k;// various countersint n,n1,n2,gmin,gmax;double m1, m2,sum, csum, fmax,sb;// 对直方图置零...memset(ihist, 0,sizeof(ihist));gmin=255; gmax=0;// 生成直方图for (i = y0 + 1;i < y0 + dy - 1; i++){np = &image[i*cols+x0+1];for (j = x0 + 1; j 〈x0 + dx - 1; j++){ihist[*np]++;if(*np > gmax)gmax=*np;if(*np < gmin)gmin=*np;np++;}}// set up everythingsum = csum = 0。
4.2 一维随机变量的方差

+∞
2
1
−
( x−µ )2 2σ 2
dx
令 σ
2
=t,
+∞ −∞
EX =
∫
(µ + σt) 2 ⋅
+∞ t2 − 2
1 e 2π
−
t2 2
dt
te dt + σ
t2 − 2 2
=µ
2
∫
−∞
1 2µσ e dt + 2π 2π
∫
+∞
−∞
∫
+∞
−∞
t e dt 2π
2
t2 − 2
=µ −
2
σ
2
2π
te
λ
⋅e
− λx + ∞ 0
=
2
DX = EX − (EX ) =
2
2
λ2
λ
2
−( ) =
2
1
1
λ
λ2
1 2 X 注意: 注意:若已知随机变量 ~e(θ ) , DX = θ
x 1 −θ e , x >0 X 的分布密度为ϕ(x) = θ 随机变量 0, x x ≤0 +∞ 1 −θ 2
vk = ∑ xik pi , pi = P{ X = xi } 离散: 离散:
i
连续: 连续: vk = ∫
+∞
−∞
x kϕ ( x ) dx, ϕ ( x )是X的密度函数
特 别 : v 1 = EX ( 期望 ) , v 2 = EX 2
µk = E( X − EX )k 阶中心矩: 随机变量的k 阶中心矩:
EX 2 = 0 × 0.6 + 1 × 0.3 + 2 × 01 = 0.5 . 2 EX 2 = 02 × 0.6 + 12 × 0.3 + 2 2 × 01 = 0.7 .
Otsu算法(大律法或最大类间方差法)

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:unsafe public int GetThreshValue(Bitmap image){BitmapData bd = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.WriteOnly, image.PixelFormat);byte* pt = (byte*)bd.Scan0;int[] pixelNum = new int[256]; //图象直方图,共256个点byte color;byte* pline;int n, n1, n2;int total; //total为总和,累计值double m1, m2, sum, csum, fmax, sb; //sb为类间方差,fmax存储最大方差值int k, t, q;int threshValue = 1; // 阈值int step = 1;switch (image.PixelFormat){case PixelFormat.Format24bppRgb:step = 3;break;case PixelFormat.Format32bppArgb:step = 4;break;case PixelFormat.Format8bppIndexed:step = 1;break;}//生成直方图for (int i = 0; i < image.Height; i++){pline = pt + i * bd.Stride;for (int j = 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为背景图象的点数//n2为0表示全部都是后景图象,与n1=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环if (n2 == 0) { break; }csum += (double)k * pixelNum[k]; //前景的“灰度的值*其点数”的总和m1 = csum / n1; //m1为前景的平均灰度m2 = (sum - csum) / n2; //m2为背景的平均灰度sb = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2); //sb为类间方差if (sb > fmax) //如果算出的类间方差大于前一次算出的类间方差{fmax = sb; //fmax始终为最大类间方差(otsu)threshValue = k; //取最大类间方差时对应的灰度的k就是最佳阈值}}image.UnlockBits(bd);image.Dispose();return threshValue;}算法实现2:Otsu算法步骤如下:设图象包含L个灰度级(0,1…,L-1),灰度值为i的的象素点数为Ni ,图象总的象素点数为N=N0+N1+...+N(L-1)。
otsu算法——图像分割

背景比例:
像素点总数:
前景和背景概率之和:
平均灰度值:
类间方差:
将公式(4)和(5)带入(6)可以得到等价公式:
核心代码:Histogram[data[i*srcimage.step + j]]++;//step指向每行的字节总量,date访问每个像素的值for (int i = 1; i < 255 ;i++)//从1开始遍历,寻找最合适的值{//每次遍历前需要初始化各变量w0 = 0; u0 = 0; w1 = 0; u1 = 0;for (int j = 0; j <= i; j++)//背景部分各值计算 { w0 += Histogram[j]; //背景部分像素点总数 u0 += j*Histogram[j]; //背景部分像素总灰度和 } u0 = u0 / w0; //背景像素平均灰度 w0 = w0 / number; //背景部分像素点所占比例}double varValueI = w1*w2*(u1 - u2)*(u1 - u2); //类间方差计算
算法过程:(1)设K(x,y)=f(x,y)/g(x,y)为像素点的 斜率,其中f(x,y)为点(x,y)的灰度值, g(x,y)为点(x,y)周围点的平均值。 (2)设阈值t1,t2将二维直方图分为A、B、 C三个区域。其中B区域代表前景和背 景像素点部分,而A、C代表边界点和 噪声点部分。
算法过程:(1)对于图像I(x,y),将前景与背景的分割阈值设为T。(2)将属于前景的像素点的个数占整个图像的比例设为w0,其平均灰度设为u0。(3)将属于背景的像素点的个数占整个图像的比例设为w1,其平均灰度设为u1。(4)图像的总平均灰度设为u,类间方差设为S。 假设图片的大小为M*N,图像中像素灰度值小于阈值T的像素个数记为N0,像素灰度大于阈值T的像素个数记为N1。则它们之间的关系如下。
一维最大类间方差法

由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。
它是在判决分析或最小二乘原理的基础上推导出来的。
参考文献:[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址算法思想:假设一幅图像有L个灰度级[1,2,…,L]。
灰度级为i的像素点的个数为n i,那么总的像素点个数就应该为N=n1+n2+…+n L。
为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:现在假设我们通过一个灰度级为k的门限将这些像素点划分为两类:C0和C1(背景和目标,或者反之亦然);C0表示灰度级为[1,…,k]的像素点,C1表示灰度级为[k+1,…,L]的像素点。
那么,每一类出现的概率以及各类的平均灰度级分别由下面的式子给出:以及其中,分别为灰度级从1到k的累积出现概率和平均灰度级(一阶累积矩),而是整幅图像的平均灰度级。
我们可以很容易验证,对于任意选定的k,都有:这两类的类内方差由下面的公式给出:这需要二阶累积矩(second-order cumulative moment,统计学概念)。
为了评价(灰度级k)这个门限“好”的程度,我们需要引入判别式分析中使用的判别式标准来测量(类的分离性测量):其中:又根据式(9),可以得出:这三个式子分别是类内方差、类间方差和灰度级的总方差。
然后,我们的问题就简化为一个优化问题,即寻找一个门限k使(12)式中给出的一个目标函数取最大值。
这个观点是出于这样一个猜想,一个好的阈值将会把灰度级分为两类,那么反过来说,就是如果一个门限能够在灰度级上将图像分割为最好的两类的话,那么这个门限就是最好的门限。
上面给出的判别式标准是分别求取λ、κ和η的最大值。
然而,对于κ而言,它又等于另外一个,比如κ=λ+1;而对于λ而言,又有η=λ/(λ+1),因为始终存在下面的基本关系:效果展示:算法评价:就最大类间方差算法而言,优点是算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。
阈值确定方法

阈值确定⽅法⼀、问题重述图形(或图像)在计算机⾥主要有两种存储和表⽰⽅法。
⽮量图是使⽤点、直线或多边形等基于数学⽅程的⼏何对象来描述图形,位图则使⽤像素来描述图像。
⼀般来说,照⽚等相对杂乱的图像使⽤位图格式较为合适,⽮量图则多⽤于⼯程制图、标志、字体等场合。
⽮量图可以任意放缩,图形不会有任何改变。
⽽位图⼀旦放⼤后会产⽣较为明显的模糊,线条也会出现锯齿边缘等现象。
⽮量图从本质上只是使⽤曲线⽅程对图形进⾏的精确描述,在以像素为基本显⽰单元的显⽰器或打印机上是⽆法直接表现的。
将⽮量图转换成以像素点阵来表⽰的信息,再加以显⽰或打印,这个过程称之为栅格化(Rasterization),见图1。
栅格化的逆过程相对⽐较困难。
假设有⼀个形状较为简单的图标,保存成⼀定分辨率的位图⽂件。
我们希望将其⽮量化,请你建⽴合理的数学模型,尽量准确地提取出图案的边界线条,并将其⽤⽅程表⽰出来。
⼆、问题分析本题的要求是完成位图的⽮量化,通过建⽴合理的数学模型,将⼀个有⼀定分辨率的位图⽂件尽量准确地提取出图案的边界线条,最终将位图⽤⽅程的形式表⽰出来。
解决本问题的流程图见下图。
⾸先,通过MATLAB读取位图的各个像素的像素值(0-1),得到位图各个点的灰度值,通过最⼤类间⽅差法和最⼤熵法确定阈值,完成灰度的⼆值化,使各个像素点的灰度值全部由0或1表⽰。
其次,将位图的轮廓通过合适的算法提取出来,根据特征值对轮廓进⾏拟合。
最后,根据拟合的函数完成位图的⽮量图,完成其⽮量化过程,并通过对⽐⽮量图和原始位图对应的。
三、问题假设及符号说明3.1问题假设3.2符号说明四、模型建⽴4.1模型准备本题要求将⼀个形状较为简单的图标,保存成⼀定分辨率的位图⽂件,即将位图⽮量化。
阈值:指释放⼀个⾏为反应所需要的最⼩刺激强度,本⽂指像素点灰度值⼆值化的临界值。
4.2阈值的确定⽅法 4.2.1最⼤类间⽅差法最⼤类间⽅差法的基本思想是将待分割图像看作是由两类组成的整体,⼀类是背景,⼀类是⽬标[6]。
otsu阈值最大类间方差法

Otsu阈值最大类间方差法是一种确定阈值的算法,通过将图像分成前景和背景两部分,以最大化这两部分之间的方差。
这种方法是在判决分析最小二乘法原理的基础上推导得出的。
具体来说,Otsu算法首先基于直方图得到每个分割特性值的发生概率,并以阈值变量将分割特征值分为两类。
然后,算法计算出每一类的类内方差及类间方差,选取使类间方差最大或类内方差最小的阈值T作为最佳阈值。
当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好。
但总体来说,Otsu阈值最大类间方差法在图像分割、二值化等方面具有高效性,且该算法的稳定性能够得到保证。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由Otsu(大津展之)于1978年提出的最大类间方差法,是引起较多关注的一种阈值选取方法。
它是在判决分析或最小二乘原理的基础上推导出来的。
参考文献:
[1] Otsu N. A threshold selection method from gray-level histogram. IEEE Trans,1979;SMC-9;62-66 下载地址
算法思想:
假设一幅图像有L个灰度级[1,2,…,L]。
灰度级为i的像素点的个数为n i,那么总的像素点个数就应该为N=n1+n2+…+n L。
为了讨论方便,我们使用归一化的灰度级直方图并且视为这幅图像的概率分布:
现在假设我们通过一个灰度级为k的门限将这些像素点划分为两类:C0和C1(背景和目标,或者反之亦然);C0表示灰度级为[1,…,k]的像素点,C1表示灰度级为[k+1,…,L]的像素点。
那么,每一类出现的概率以及各类的平均灰度级分别由下面的式子给出:
以及
其中,
分别为灰度级从1到k的累积出现概率和平均灰度级(一阶累积矩),而
是整幅图像的平均灰度级。
我们可以很容易验证,对于任意选定的k,都有:
这两类的类内方差由下面的公式给出:
这需要二阶累积矩(second-order cumulative moment,统计学概念)。
为了评价(灰度级k)这个门限“好”的程度,我们需要引入判别式分析中使用的判别式标准来测量(类的分离性测量):
其中:
又根据式(9),可以得出:
这三个式子分别是类内方差、类间方差和灰度级的总方差。
然后,我们的问题就简化为一个优化问题,即寻找一个门限k使(12)式中给出的一个目标函数取最大值。
这个观点是出于这样一个猜想,一个好的阈值将会把灰度级分为两类,那么反过来说,就是如果一个门限能够在灰度级上将图像分割为最好的两类的话,那么这个门限就是最好的门限。
上面给出的判别式标准是分别求取λ、κ和η的最大值。
然而,对于κ而言,它又等于另外一个,比如κ=λ+1;而对于λ而言,又有η=λ/(λ+1),因为始终存在下面的基本关系:
效果展示:
算法评价:
就最大类间方差算法而言,优点是算法简单,当目标与背景的面积相差不大时,能够有效地对图像进行分割。
但是,当图像中的目标与背景的面积相差很大时,表现为直方图没有明显的双峰,或者两个峰的大小相差很大,分割效果不佳,或者目标与背景的灰度有较大的重叠时也不能准确的将目标与背景分开。
导致这种现象出现的原因是该方法忽略了图像的空间信息,同时该方法将图像的灰度分布作为分割图像的依据,因而对噪声也相当敏感。
所以,在实际应用中,总是将其与其他方法结合起来使用。