草庐IT

大津法(最大类间方差法OTSU)

liutangplease 2023-07-12 原文

        大津法是由大津展之(おおつのぶゆき)发明的算法,故称大津法。

 一、 数学原理

        大津法又叫最大类间方差法、最大类间阈值法(OTSU)。它的基本思想是,用一个阈值将图像中的数据分为两类,一类中图像的像素点的灰度均小于这个阈值,另一类中的图像的像素点的灰度均大于或者等于该阈值。如果这两个类中像素点的灰度的方差越大,说明获取到的阈值就是最佳的阈值(方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。)。则利用该阈值可以将图像分为前景和背景两个部分。而我们所感兴趣的部分一般为前景。

        其优点是计算简单快速,不受图像亮度和对比度的影响。缺点是对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

二、编程实现

        程序是通过matlab实现的,通常,我们在智能车大赛的过程中也常常会用到,代码含义已注释。

filename='E:\learning\机器视觉\machinevision\saidao.jpg';
rgb = imread(filename);
gray = rgb2gray(rgb);%转换为灰度图
gray_max = max(max(gray));
gray_min = min(min(gray));
gray_list = gray_min : gray_max;%阈值范围
ISIZE = size(gray);%图像大小
pixel_all = ISIZE(1) * ISIZE(2);%总像素个数
Tmp = 0;%存放类间方差
threshold = 0;%存放阈值

for i = 1 : length(gray_list)  %从MIN到MAX
    gray_value = gray_list(1,i);
    pixel_front = 0;%前景像素个数
    pixel_back = 0;%背景像素个数
    gray_front = 0;%前景总灰度
    gray_back = 0;%背景总灰度
    for j = 1 : ISIZE(1)
        for k=1 : ISIZE(2)
            pixelgray = gray(j,k);
            if(pixelgray >= gray_value)
                pixel_front = pixel_front+1;
                gray_front = gray_front + double(pixelgray);
            else
               pixel_back = pixel_back+1;
               gray_back = gray_back+double(pixelgray);
            end
        end
    end
    w0 = pixel_front/pixel_all;%前景点数比例
    w1 = pixel_back/pixel_all;%背景点数比例
    u0 = gray_front/pixel_front;%前景点数平均灰度
    u1 = gray_back/pixel_back;%背景点数平均灰度
    u = (gray_front+gray_back)/pixel_all;%图像总平均灰度

    tmp = w0*(u0-u)*(u0-u) + w1*(u1-u)*(u1-u);
    if(Tmp < tmp)
        threshold = gray_value;
        Tmp = tmp;
    end
end

%二值化
black_and_white = gray;
for j = 1:ISIZE(1)
   for k = 1:ISIZE(2)
       if(black_and_white(j,k) >= threshold)
           black_and_white(j,k) = 255;
       else
           black_and_white(j,k) = 0;
       end
   end
end

level = graythresh(gray);
imgbw = im2bw(gray,level);

level2=double(threshold)/255;
imgbw2 = im2bw(gray,level2);

subplot(221); imshow(gray);
subplot(222); imshow(black_and_white);
subplot(223); imshow(imgbw);
subplot(224); imshow(imgbw2);

三、处理效果

        可见效果较好。 

机器视觉目录:

机器视觉(一):概述

机器视觉(二):机器视觉硬件技术

机器视觉(三):摄像机标定技术

机器视觉(四):空域图像增强

机器视觉(五):机器视觉与世界杯

机器视觉(六):频域图像增强

机器视觉(七):图像分割

机器视觉(八):图像特征提取

机器视觉(九):图像配准

有关大津法(最大类间方差法OTSU)的更多相关文章

  1. javascript - 改变鼠标移动的方差 - 2

    所以我在摆弄trianglify.js。我的目标是当鼠标移动时,我的三Angular形Canvas的方差会发生变化。理论上很好,但实际上并没有真正采用我已经尝试了几种不同的代码格式,但实际上似乎无法进行三Angular化以尊重新值。希望有人能指出我做错了什么。//DoTraingleCanvaswindow.onload=function(){varpattern=Trianglify({width:window.innerWidth,height:window.innerHeight,cell_size:120,stroke_width:1.3,variance:0.75,seed:

  2. regex - 查找具有零距离方差和记录的瓦特的条目 - 2

    我是一名自行车手和一名程序员。在我的骑行过程中,我使用基于手机的GPS跟踪器和功率计将数据记录到xml文件中。骑行后,我使用功率计软件合并数据,然后上传到网站。在网站上,生成的数据显示WR瓦特的数据非常不准确(它是加权平均值,也称为归一化功率,根据定义高于平均功率但低于我记录的最大瓦特数。请参阅http://ridewithgps.com/trips/4834566(导出TCX历史记录获取我所指的文件)。/\d{4,}不返回任何结果。Calories:1809MaxWatts:676Avg.Watts:213(170with0s)WRPower23487Work1681kJMaxSpe

  3. Otsu算法——最大类间方差法(大津算法) - 2

    Otsu算法,又被称为最大类间方差法(大津算法),是一种确定阈值的算法。1.算法理解Otsu算法之所以称为最大类间方差法是因为,该方法主要是通过阈值进行前后背景分割,而该方法确定最佳阈值的方法是该值使类间方差最大,它是按图像的灰度特性,将图像分成背景和前景两部分,使类间方差最大的分割意味着错分概率最小。2.算法原理以灰度图像为例,对于图像imgimgimg,我们可以将其看作一个M×NM\timesNM×N大小的矩阵,即图像中的像素,每一个值即为像素值,其中像素值在(0 255)(0~255)(0 255)之间。前景(即目标)和背景的分割阈值记作optimalthresholdoptimal_{

  4. 【什么是自相关矩阵,自协方差矩阵,互相关矩阵,互协方差矩阵?】 - 2

    目录写在前面的话前置知识自协方差矩阵具体样例自相关矩阵自相关矩阵与自协方差矩阵的关系互协方差矩阵互相关矩阵互相关矩阵与互协方差矩阵的关系性质相关系数写在前面的话最近看模式识别课程的时候卡在了一个地方,见下图:协方差矩阵倒还知道,自相关矩阵?怎么推导的?它有什么意义?上网查了资料,要么晦涩难懂,要么一堆废话,这里我想尽量用最简洁的语言讲清楚它们。前置知识向量的内积与外积场景:机器学习样本(n个样本,N个维度(特征)):X={x1,x2,...,xn}xi={wi,1,wi,2,...,wi,N}Ti∈[1,n]wj={w1,j,w2,j,...,wn,j}j∈[1,N]X=\left\{x_1,

  5. c# - 键值对协方差 - 2

    在这个例子中有没有更好的方法来模拟协方差?理想情况下我想这样做:privateIDictionary>foos;publicIEnumerable>Foos{get{returnfoos;}}但是KeyValuePair不是协变的。相反,我必须这样做:publicIEnumerable>>Foos{get{returnfoos.Select(x=>newKeyValuePair>(x.Key,x.Value));}}有更好/更清洁的方法吗? 最佳答案 不幸的是,KeyValuePair是一个结构;和结构在.NET中不会表现出差异。你

  6. c# - 为什么 C#/CLR 不支持方法重写协方差/反方差? - 2

    关于绕过C#不允许方法返回(和参数)类型被更改为兼容类型的覆盖的限制,有很多问题和答案,但是为什么存在这个限制,在C#编译器中还是在CLR中?如我所见,如果允许协方差/协方差,就没有什么可以破坏的,那么它背后的原因是什么?类似的问题可能会被问到扩大访问参数——例如用公共(public)方法覆盖protected内部方法(Java支持的东西,IIRC) 最佳答案 这个答案不是在谈论C#,但它帮助我更好地理解了问题,也许它会对其他人有所帮助:Whyistherenoparametercontra-varianceforoverridin

  7. c# - Casting List<T> - 协方差/逆变问题 - 2

    给定以下类型:publicinterfaceIMyClass{}publicclassMyClass:IMyClass{}我想知道如何转换List到List?我对协变/逆变主题不是很清楚,但我知道我不能因此而简单地使用List。我只能想出这个微不足道的解决方案;缺乏优雅,浪费资源:...publicListConvertItems(Listinput){varresult=newList(input.Count);foreach(varitemininput){result.Add(item);}returnresult;}....如何以更优雅/更高效的方式解决它?(请注意,我需要.N

  8. c# - 为什么数组协方差被认为如此可怕? - 2

    在.NET中,引用类型数组是协变的。这被认为是一个错误。但是,我不明白为什么这会如此糟糕,请考虑以下代码:string[]strings=new[]{"Heythere"};object[]objects=strings;objects[0]=newobject();噢,这会编译,但会在运行时失败。当我们试图将一个对象粘贴到一个字符串[]中时。好吧,我同意这很糟糕,但是T[]扩展了Array并且还实现了IList(和IList,我想知道它是否实现了IList...>。Array和IList都让我们犯了同样可怕的错误。string[]strings=new[]{"Heythere"};A

  9. c# - 为什么编译器不能在这种重载解析情况下告诉更好的转换目标? (协方差) - 2

    理解关于重载决议的C#语言规范显然很难,现在我想知道为什么这个简单的案例失败了:voidMethod(Funcf){}voidMethod(Funcf){}voidCall(){Method(()=>{thrownewNotSupportedException();});}这会产生编译时错误CS0121,以下方法或属性之间的调用不明确:后跟我的两个Method函数成员(重载)。我所期望的是Func是一个比Func更好的转换目标,然后应该使用第一个重载。自.NET4和C#4(2010)起,通用委托(delegate)类型Func在TResult中一直协变,因此存在从Func的隐式转换至F

  10. 统计学之方差分析 - 2

    一、基本原理从形式上看,方差分析是比较多个总体的均值是否相等,但本质上它所研究的是分类自变量对数值因变量的影响。当检验多个总体的均值是否相等时,方差分析是更有效的统计方法。由于是通过对数据误差的分析来判断均值是否相等,故名方差分析。考虑一个例子:一家超市连锁店进行了一项研究,想确定超市所在的位置和竞争者的数量对销售额是否有显著影响,将超市位置分为3类,竞争者数量分为4类。表1超市位置、竞争者数量和销售额数据 如果只考虑“超市位置”对销售额是否有显著影响,实际上也就是要判断不同位置超市的销售额均值是否相同。若它们的均值相同,意味着“超市位置”对销售额没有显著影响;若均值不同,意味着有显著影响。二

随机推荐