图像分割最大类间方差法

合集下载

OpenCV-Python系列之OTSU算法

OpenCV-Python系列之OTSU算法

OpenCV-Python系列之OTSU算法上⼀个教程中,我们谈到了关于图像⼆值化的两种⽅法,⼀种是固定阈值法,另⼀种是⾃适应阈值法,总的来说,⾃适应阈值法在某些⽅⾯要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选⼿,也就是OTSU算法(⼜称为⼤津算法和最⼤类间⽅差法)。

最⼤类间⽅差法是1979年由⽇本学者⼤津提出的,是⼀种⾃适应阈值确定的⽅法,⼜叫⼤津法,简称OTSU,是⼀种基于全局的⼆值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。

当取最佳阈值时,两部分之间的差别应该是最⼤的,在OTSU算法中所采⽤的衡量差别的标准就是较为常见的最⼤类间⽅差。

前景和背景之间的类间⽅差如果越⼤,就说明构成图像的两个部分之间的差别越⼤,当部分⽬标被错分为背景或部分背景被错分为⽬标,都会导致两部分差别变⼩,当所取阈值的分割使类间⽅差最⼤时就意味着错分概率最⼩。

OSTU原理在⼤津算法中,我们穷举搜索能使类内⽅差最⼩的阈值,定义为两个类的⽅差的加权和:权重是被阈值 t分开的两个类的概率,⽽是这两个类的⽅差⼤津证明了最⼩化类内⽅差和最⼤化类间⽅差是相同的:⽤类概率和类均值来表⽰。

类概率⽤阈值为t 的直⽅图计算:⽽类均值为:类概率和类均值可以迭代计算,⼤津算法得出了0:1范围上的⼀个阈值。

这个阈值⽤于图像中出现的像素强度的动态范围。

例如,若图像只包含155到255之间的像素强度,⼤津阈值0.75会映射到灰度阈值230(⽽不是192,因为图像包含的像素不是0–255全范围的)。

对于图像I(x,y),前景(即⽬标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的⽐例记为ω0,其平均灰度µ0;背景像素点数占整幅图像的⽐例为ω1,其平均灰度为µ1。

图像的总平均灰度记为µ,类间⽅差记为g。

假设图像的背景较暗,并且图像的⼤⼩为M×N,图像中像素的灰度值⼩于阈值T的像素个数记作N0,像素灰度⼤于阈值T的像素个数记作N1,则有: (1) ω0=N0/ (M×N) (2) ω1=N1/ (M×N) (3) N0 + N1 = M×N (4) ω0 + ω1 = 1 (5) µ = ω0 * µ0 + ω1 * µ1 (6) g = ω0 * (µ0 - µ)2 + ω1 * (µ1 - µ)2将式(5)代⼊式(6),得到等价公式: (7) g = ω0 *ω1 * (µ0 - µ1)2采⽤遍历的⽅法得到使类间⽅差g最⼤的阈值T。

Otsu算法(大律法或最大类间方差法)

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于1978年提出大津阈值分割法又称为最大类间方差法。

它是一种自动的非参数非监督的门限选取法。

该方法的基本思路是选取的t的最佳阈值应当是使得不同类间的分离性最好。

它的计算方法是首先计算基于直方图而得到的各分割特征值的发生概率,并以阈值变量t将分割特征值分为两类,然后求出每一类的类内方差及类间方差,选取使得类间方差最大,类内方差最小的t作为最佳阈值。

由于该方法计算简单,在一定条件下不受图像对比度与亮度变化的影响,被认为是阈值自动选取的最优方法。

该方法的缺点在于,要求得最佳阈值,需要遍历灰度范围0—(L-1)内的所有像素并计算出方差,当计算量大时效率会很低。

同时,在实际图像中,由于图像本身灰度分布以及噪声干扰等因素的影响,仅利用灰度直方图得到的阈值并不能使图像分割得到满意的结果,虽在一定程度上可以消除噪声的影响,但该方法计算量相当大,难以应用到实时系统。

(二)基于边缘检测的分割算法。

otsu算法——图像分割

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。则它们之间的关系如下。

最大类间方差法在图像处理中的应用

最大类间方差法在图像处理中的应用
Q i a .H N 0 , N hn—ki I —n Z A G B 2WA G Z a L a
( . iinU i rt X ’ nS a X 10 1 C ia; 1 Xda nv sy, i a h n i7 0 7 , hn ei
2 胁b a at ar o mu i t n C L D, h i h ag日 6i 5 8 , h a . e F r s H rsC m n a os O. T S i z u n e 0 1 C i ; E i ci j a e0 n
sg nain bsdo a kru dsbrci A dtepoes grsl r o ae . e mett ae nb c go n u t t n. n h rc si eut aec mprd o a o n s
Ke r s i g e e tt n m t no j t ee t n b c gon u t t n; T U ywo d maesg n i ; oi be tci ;ak ru dsbr i O S m ao o c d o c a o
3 S iizu n r o a dIsit , hJah n . hJah a gAmyC mm n ntue S ii a g胁 0 0 8 C i ) t z 5 0 4, hn a
Ab t a t I g e me t i sci c li g rc si ga d i eu t a e t h o tag r h i c y i p p rit d c s te sr c ma e sg na o i r ia n i ep o es n sr sl f c e p s—lo tmsdr t .h 8 a e r u e h t n t ma n t s t i el I no

图像阈值分割方法的研究

图像阈值分割方法的研究

目录摘要 (1)Abstract (2)前言 (3)第一章绪论 (4)1.1 图像阈值分割的背景及研究意义 (4)1.2 图像阈值分割国内外研究现状 (5)1.3论文研究的主要内容及各章结构安排 (5)第二章图像分割方法综述 (6)2.1图像分割技术的基本概念 (6)2.2.图像分割的基本分类 (6)2.2.1 边缘检测分割法 (7)2.2.2 阈值分割法 (8)2.2.3 区域分割法 (8)第三章图像阈值分割技术 (8)3.1 迭代法 (9)3.2 最大类间方差法 (11)3.3最小误差法 (13)3.4 最大熵法 (16)第四章图像分割算法的评价 (19)4.1 Dice系数 (19)4.2 Hausdorff距离 (20)4.3 Jaccard相似系数 (21)4.4 准确率、召回率 (21)4.5 分割效果分析 (21)第五章结论 (25)参考文献 (26)摘要图像分割是一个十分基础却十分重要的问题,它是数字图像处理和数字图像分析之间的关键桥梁,图像分割效果的好坏与后续一系列图像分析问题紧密相关。

所以,图像分割技术在整个数字图像处理中的地位十分重要。

本文首先对图像分割的有关理论做出简洁的介绍,重点探究图像阈值分割技术。

将对几种比较常见的阈值分割算法进行研究,主要是迭代法、最大类间方差法、最大熵法、最小误差法,并且对特定图像在MATLAB环境中进行了仿真测试。

本文采纳了一种图像分割评价标准,综合了Dice系数、Hausdorff距离、Jaccard相似系数、准确率、召回率等指标。

将手动分割的图像作为金标准,与算法分割的图像进行比较,在MATLAB 环境下给出算法图像与金标准图像的相似度,从而可以在评价各图像阈值分割算法上具有更强的说服力。

从最终的试验结果和参数分析可以看出,相比较其他三种算法分割方法,最大类间方差法不仅可以将图像中的背景和目标分割开来,而且对于图像细节的处理也比较好,并且在处理不同图像的图像时也具有良好的稳定性。

Ots算法(大律法或最大类间方差法)

Ots算法(大律法或最大类间方差法)

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大津法阈值分割

otsu大津法阈值分割

otsu大津法阈值分割图像处理中的阈值分割是将图像分成两个或多个部分的一种方法,其中关键是选择适当的阈值。

Otsu大津法阈值分割是一种自动阈值选取算法,能够有效地辨识图像背景和前景,被广泛应用于各种图像分割任务。

一、Otsu大津法的原理及步骤Otsu大津法是基于最大类间方差的阈值选取算法。

其原理是通过找到使得类间方差最大的阈值来实现图像的分割。

这种方法被广泛应用于简单的图像分割任务,其步骤如下:1.计算图像的灰度直方图,获得各个灰度级下的像素数量。

2.根据像素数量计算各个灰度级的占比。

3.在灰度级范围内循环迭代,计算每个灰度级作为阈值分割后的类间方差。

4.选取使得类间方差最大的灰度级作为最优阈值。

5.根据最优阈值对图像进行二值化处理,将图像分为两个部分:背景和前景。

二、Otsu大津法的优点Otsu大津法有以下几个优点:1.自动化:Otsu大津法能够自动选择最佳阈值,无需人工干预,大大减少了人工处理的工作量。

2.可靠性:Otsu大津法通过最大化类间方差选择阈值,使得图像分割结果更加准确可靠。

3.适应性:Otsu大津法适用于各种类型的图像,无论是单一目标或多目标,都能有效实现分割。

三、Otsu大津法的应用领域Otsu大津法广泛应用于图像处理领域的各个方面,包括但不限于以下几个方面:1.医学图像分割:在医学影像学中,Otsu大津法常用于对CT、MRI 等图像进行分割,辅助医生进行病变诊断。

2.人脸识别:在人脸识别中,Otsu大津法可以将人脸与背景分离,提取人脸特征,以用于人脸识别算法中。

3.字符识别:在光学字符识别(OCR)中,Otsu大津法常用于图像的二值化处理,提高字符识别的准确性。

4.物体检测:在计算机视觉中,Otsu大津法可以实现物体的前景与背景的分割,用于物体检测与跟踪。

5.图像增强:Otsu大津法能够提取图像的前景与背景,为后续的图像增强算法提供更好的处理基础。

四、Otsu大津法的改进和扩展虽然Otsu大津法在图像分割任务中表现出色,但也存在一些限制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OPENCV的二值化操作中,有一种“大津阈值处理”的方法,使用函数cvThreshold(image,image2,0,255,CV_THRESH_OTSU) 实现,该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起作用。

OTSU算法OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。

它是按图像的灰度特性,将图像分成背景和前景两部分。

因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。

因此,使类间方差最大的分割意味着错分概率最小。

设灰度图像灰度级是L,则灰度范围为[0,L-1],利用OTSU算法计算图像的最佳阈值为:t = Max[w0(t) * (u0(t) - u)^2 + w1(t) * (u1(t) - u)^2)]其中的变量说明:当分割的阈值为t时,w0为背景比例,u0为背景均值,w1为前景比例,u1为前景均值,u为整幅图像的均值。

使以上表达式值最大的t,即为分割图像的最佳阈值。

以下是一段在OpenCV中实现的C语言程序,即一个使用OTSU算法提取图像阈值的函数,输入参数为一个图像指针,返回分割该图像的最佳阈值。

其中的变量说明:当分割的阈值为t时w0为背景像素点占整幅图像的比例u0为w0平均灰度w1为前景像素点占整幅图像的比例u1为w1平均灰度u为整幅图像的平均灰度公式:g = w0*pow((u-u0),2) + w1*pow((u-u1),2)int MyAutoFocusDll::otsuThreshold(IplImage *frame){const int GrayScale = 256;int width = frame->width;int height = frame->height;int pixelCount[GrayScale];float pixelPro[GrayScale];int i, j, pixelSum = width * height, threshold = 0;uchar* data = (uchar*)frame->imageData; //指向像素数据的指针for(i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//统计灰度级中每个像素在整幅图像中的个数for(i = 0; i < height; i++){for(j = 0;j < width;j++){pixelCount[(int)data[i * width + j]]++; //将像素值作为计数数组的下标 }}//计算每个像素在整幅图像中的比例float maxPro = 0.0;int kk=0;for(i = 0; i < GrayScale; i++){pixelPro[i] = (float)pixelCount[i] / pixelSum;if( pixelPro[i] > maxPro ){maxPro = pixelPro[i];kk = i;}}//遍历灰度级[0,255]float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for(i = 0; i < GrayScale; i++) // i作为阈值{w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for(j = 0; j < GrayScale; j++){if(j <= i) //背景部分{w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else //前景部分{w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;u1 = u1tmp / w1;u = u0tmp + u1tmp;deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if(deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}return threshold;}接下来介绍OTSU方法的原理:********************************************************************* ********************************************************************* *********************OTSU法对于具有双峰性质的灰度图像或是彩色图像的某一通道的分割效果很好,程序为了增加健壮性加了个可以根据实际情况确定的修正值th_set.********************************************************************* ********************************************************************* ********************function y1=OTSU(image,th_set)image=imread('color1.bmp');gray=rgb2gray(image);%原图像的灰度图low_high=stretchlim(gray);%增强图像,似乎也不是一定需要gray=imadjust(gray,low_high,[]);% subplot(224);imshow(gray);title('after adjust');count=imhist(gray);[r,t]=size(gray);n=r*t;l=256;count=count/n;%各级灰度出现的概率for i=2:lif count(i)~=0st=i-1;breakendend%以上循环语句实现寻找出现概率不为0的最小灰度值for i=l:-1:1if count(i)~=0;nd=i-1;breakendend%实现找出出现概率不为0的最大灰度值f=count(st+1:nd+1);p=st;q=nd-st;%p和分别是灰度的起始和结束值u=0;for i=1:q;u=u+f(i)*(p+i-1);ua(i)=u;end%计算图像的平均灰度值for i=1:q;w(i)=sum(f(1:i));end%计算出选择不同k的时候,A区域的概率d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差[y,tp]=max(d);%求出最大方差对应的灰度级th=tp+p;if th<th_setth=tp+p;elseth=th_set; %根据具体情况适当修正门限endy1=zeros(r,t);for i=1:rfor j=1:tx1(i,j)=double(gray(i,j));endendfor i=1:rfor j=1:tif (x1(i,j)>th)y1(i,j)=x1(i,j);elsey1(i,j)=0;endendend%上面一段代码实现分割% figure,imshow(y1);% title('灰度门限分割的图像');接下来介绍OTSU方法的原理以及用C语言实现:阈值将原图像分成前景、背景两个图像。

前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度;背景:用n2,sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度;当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准;而在otsu算法中这个衡量差别的标准就是最大类间方差;在以下程序中类间方差用是sb表示,最大类间方差用fmax,关于最大类间方差(otsu)的性能:类间方差对噪音和目标大小十分敏感,它仅对类间方差为单峰值的图像产生较好的分割效果,当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差使用是最少的。

最大类间方差(otsu)的公式推导:记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1;则图像的总平均灰度为:u=w0*u0+w1*u1;前景和背景图像的方差:g=w0*(u0-u).^2+w1*(u1-u).^2=w0*w1*(u0-u1).^2此公式为方差公式。

上面的g公式也就是下面程序中得sb的表达式:当方差g最大时,可以认为此时前景与背景差异最大,也就是此时的灰度值是最佳阈值;。

相关文档
最新文档