当前位置: 首页 > news >正文

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

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

 一、 数学原理

        大津法又叫最大类间方差法、最大类间阈值法(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);

三、处理效果

        可见效果较好。 

相关文章:

  • 搭建ELK分布式日志系统
  • 电子竞价是如何运作的?
  • TypeScript 学习之路 - 基础篇
  • 将路径中的“\\”换成“/”的方法
  • (一)Dubbo快速入门、介绍、使用
  • java-多线程,一个线程执行完毕,其他线程跳出运算-利用线程组ThreadGroup(子线程中执行当前线程组的interrupt方法)
  • 三分钟读懂什么是动作捕捉
  • Android—Surface,ViewRootImpl.relayoutWindow
  • <C++>详解string类
  • (一) springboot详细介绍
  • (一)UDP基本编程步骤
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • 新作文杂志新作文杂志社新作文编辑部2022年第8期目录
  • d的nan讨论4
  • Python 运算符和表达式
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CSS3 变换
  • EventListener原理
  • js对象的深浅拷贝
  • leetcode386. Lexicographical Numbers
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mysql数据库的条件查询语句
  • NSTimer学习笔记
  • PHP的类修饰符与访问修饰符
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpringBoot 实战 (三) | 配置文件详解
  • v-if和v-for连用出现的问题
  • Web设计流程优化:网页效果图设计新思路
  • 阿里研究院入选中国企业智库系统影响力榜
  • 番外篇1:在Windows环境下安装JDK
  • 反思总结然后整装待发
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 前端之React实战:创建跨平台的项目架构
  • 使用 Docker 部署 Spring Boot项目
  • 写代码的正确姿势
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • scrapy中间件源码分析及常用中间件大全
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​卜东波研究员:高观点下的少儿计算思维
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #etcd#安装时出错
  • #LLM入门|Prompt#3.3_存储_Memory
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (function(){})()的分步解析
  • (Java)【深基9.例1】选举学生会
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NSDate) 时间 (time )比较
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm码农论坛 毕业设计 231126
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)mysql使用Navicat 导出和导入数据库