OTSU算法
- 格式:docx
- 大小:338.95 KB
- 文档页数:4
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阈值分割是一种基于图像的自动阈值选择算法,用于将图像分割成前景和背景两部分。
该分割方法可以有效地抑制不同灰度级的像素混合,并克服Kittler阈值分割算法存在的一些缺点。
二、阈值分割原理1. 什么是阈值分割?阈值分割是一种图像处理算法,用于将一幅图像中的像素分割成前景和背景两部分,以便更容易对图像进行分析。
2. 如何选择阈值?选择阈值的方法有很多种,主要有:经验法:根据对图像的实际感知,经验地确定最佳的阈值。
用户设定法:根据用户的需求,设定一个阈值来分割图像。
自动阈值选择法:根据图像的直方图和其他信息,自动选择一个最佳的阈值。
三、Otsu阈值分割Otsu阈值分割是一种自动阈值选择算法,它可以根据图像的灰度直方图和其他信息,自动选择一个最佳的阈值进行分割。
它是为了克服Kittler阈值分割算法存在的一些缺点而发明的。
1. Otsu阈值分割的基本原理Otsu阈值分割的目标是寻找一个使两个灰度级的像素混合最小的阈值。
因此,它的基本原理如下:(1)假定图像只有两个灰度级,即前景和背景;(2)计算图像的灰度直方图,分别计算前景和背景像素的期望;(3)遍历每一个阈值,计算前景和背景两个灰度级的标准差;(4)计算前景和背景两个灰度级的混合,并取最小值;(5)得到的最小值就是最优阈值。
2. Otsu阈值分割的优势与Kittler阈值分割算法相比,Otsu阈值分割算法有以下优势:减少噪声:Otsu阈值分割算法可以有效地抑制不同灰度级的像素混合,从而更好地抑制噪声;提高分割准确度:Otsu阈值分割算法可以根据图像的灰度直方图,自动选择一个最佳的阈值,从而提高分割准确度;支持多种分割方式:Otsu阈值分割算法不仅可以支持二值分割,还可以支持多值分割,甚至可以使用多个阈值进行多次分割。
四、总结Otsu阈值分割是一种自动阈值选择算法,它可以根据图像的灰度直方图和其他信息,自动选择一个最佳的阈值进行分割。
大津二值化算法大津二值化算法(Otsu's method)是一种自适应二值化算法,它是由日本学者大津展之于1979年在日本出版的论文《A Threshold Selection Method from Gray-Level Histograms》中提出的。
算法原理是通过计算图像直方图,尝试找到一个阈值,使得将图像分成前景和背景两部分后,前景和背景之间的方差最小。
找到这个阈值后,将灰度值大于该阈值的像素设为前景,灰度值小于该阈值的像素设为背景。
具体的实现步骤是:1. 统计图像的灰度直方图,即将图像中每个灰度级别的像素的数量记录下来,得到一个长度为256的数组hist。
2. 计算累计直方图函数cumSum,其中cumSum[i]表示灰度值小于等于i的像素的数量之和。
3. 计算每个灰度级别i的像素在前景和背景两个类别中的像素数目分别为n1[i]和n2[i]:n1[i] = cumSum[i]n2[i] = sum(hist) - cumSum[i]4. 计算前景和背景的平均灰度值分别为mean1[i]和mean2[i]:mean1[i] = (cumSum[i]*i)/n1[i]mean2[i] = ((sum(hist)-cumSum[i])*i)/n2[i]5. 计算前景和背景之间的方差(类间方差):variance[i] = (n1[i]*n2[i])*(mean1[i]-mean2[i])*(mean1[i]-mean2[i])6. 找到使得类间方差最小的阈值,即variance数组中的最大值对应的灰度级别就是最佳阈值。
7. 根据最佳阈值,将灰度值大于该阈值的像素设为前景,灰度值小于该阈值的像素设为背景,得到二值化图像。
优点:自适应性很强,可以适用于各种不同光照下的图像。
缺点:如果图像中的前景和背景类别分布非常不均衡,则可能找不到合适的阈值,导致二值化效果不理想。
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算法代码:time=now; %取当前时间I=imread('lena256.bmp');%读取图像imshow(I);[N,M]=size(I);%用N,M分别存储图像数组的行数和列数length=N*M; %取得图像数组的像素点个数L=256;%设定图像的灰度为256count=0; %用来记录出现灰度值相同的个数for k=0:L-1for i=1:Nfor j=1:Mif I(i,j)==kcount=count+1; %个数加一endendend %求出每个像素出现的次数P(k+1)=count/length;%记录像素值为K出现的概率count=0; %再次赋予0进入下一个像素的个数记录endfor i=1:Lif P(i)~=0first=i;%找出第一个概率不连续为0的像素breakendendfor i=L:-1:1if P(i)~=0last=i;%找出最后一个出现概率不连续为0的像素breakendentropy1=0; %记录灰度图像的熵值for i=first:lastif (P(i)~=0)entropy1=entropy1+P(i)*log2(1/P(i)); %求取熵值的公式endendep=0;%用来记录每个灰度级的概率averF=0; %记录目标均值的叠加值averB=0; %记录背景均值的叠加值for t=0:Ly=t+1;%好做标记if (y>first)&&(y<last) %防止w0(y)和w1(y)取0的情况出现for k=1:yep=ep+P(k);%存储选取阈值为t时目标点的概率endw0(y)=ep;w1(y)=1-w0(y); %总概率为1for i=1:tep=averF+(i)*P(i)/w0(y); %求出目标均值endu0(y)=averF; %赋予目标均值for i=t:LaverB=averB+(i)*P(i)/w1(y);% 求出背景均值endu1(y)=averB;u=w0(y)*u0(y)+w1(y)*u1(y); %总均值arg(y)=w0(y)*(u0(y)-u)*(u0(y)-u)+w1(y)*(u1(y)-u)*(u1(y)-u); %算出每一个t对应的方差值endaverF=0;averB=0; %用完一次需赋0,以保证进入下一个t的计算的正确性endhigh=arg(1);for i=2:last-first-3 %因为first<t<last,所以t可取值的个数为last-first-2 if high<arg(i)high=arg(i); %把大值赋予max(x)x=i; %记录大值的下标endendt=x-1;%记录t是从下标1开始的,此时的t就是我们所求的阈值I0=0;I1=0;for i=1:Nfor j=1:Mif (I(i,j)>=t)y1(i,j)=255;I1=I1+1;%统计目标像素点的个数elsey1(i,j)=0;I0=I0+1;%统计背景像素点的个数endendendfigure,imshow(y1); %显示二值化图像entropy1; %求出二值化图像的熵值back=(I0/(N*M))*log2(N*M/I0); %求出背景像素的熵值fore=(I1/(N*M))*log2(N*M/I1); %求出目标像素的熵值entropy2=back+fore %求出二值化图像的熵值exetime=second(now-time) %求得程序运行所需时间,并转化成秒显示t %阈值显示最大方差比那个只要求写简单程序,五十行左右,谢谢帮助了!。
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大津法在图像分割任务中表现出色,但也存在一些限制。
根据OTSU算法,记t为前景与背景的分割阈值,前景点数占图像比例为W0,内积平均值为U0;背景点数占图像比例为W1, 内积平均值为U1.图像的内积平均值为:u=W0*U0 + W1*U1.从最小灰度值到最大灰度值便利t,当t使得值g=W0*(U0-u)2+W1*(U1-u)2最大时t即为分割的最佳阈值。
该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成整幅图像,而前景取值W1,概率为W0,背景取值U1,概率为W1,总均值为U,根据方差的定义既是该式。
因方差是内积值(色彩差异)分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分目标错为背景或者部分背景分为目标都会导致两部分差别变小,因此使类间方差最大的分割意味着错分概率最小.
在实验中,内积值的变化范围在0-1之间,其精度取值0.0001,根据内积值的定义,我们可以作出如下化简计算,当内积值小于0.9000的时候,像素点颜色差异足够大,因此,将这些像素点值归为计为0.9000这个内积值的像素点.因此,我们可以得到1001个内积值,其范围0.9000-1.0000. 对这1001个内积值分别计算其类间方差,然后寻找使类间方差最大的内积值,即为我们的阈值.。
图像二值化----otsu(最大类间方差法、大津算法)
最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。
它是按图像的灰度特性,将图像分成背景和目标两部分。
背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。
因此,类间方差最大的分割意味着错分概率最小。
OTSU被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。
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}。