自适应阈值分割-OTSU

news2024/11/17 22:15:09

OTSU

在前面固定阈值中选取了一个阈值为127进行阈值分割,那如何知道选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。

Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法。其算法计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大分割意味着错分概率最小。Otsu阈值分割方法,选择使得类间方差最大的值作为阈值,设图像的归一化直方图为p,亮度阶为k(例如元素值取0~255,则k=256)。

示例代码

作者:liutangplease
链接:https://www.zhihu.com/question/362086374/answer/2654724809
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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);

效果图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之std::atomic类模板原子操作应用总结(二百三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

JAVA+SpringBoot+VUE工厂车间管理系统(含论文)源码

springboot169基于vue的工厂车间管理系统的设计录像(毕业设计jdz2023) 一、源码描述 JAVASpringBootVUE工厂车间管理系统,包含源码数据库论文等,含MySQL脚本&#xff0c;基于B/S和Web开发的&#xff0c;感兴趣的朋友可以下载看看 二、功能介绍 1、个人中心 2、人员管理 3、设备…

计算机图像处理:图像轮廓

图像轮廓 图像阈值分割主要是针对图片的背景和前景进行分离&#xff0c;而图像轮廓也是图像中非常重要的一个特征信息&#xff0c;通过对图像轮廓的操作&#xff0c;就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是&#xff1a;先用阈值分割划分为两类图…

Textpad 缺少Java编译和运行功能

一、问题 缺少Java编译和运行功能 二、处理方法 1、点击菜单Configure->Preferences 2、点击 Tools -> Add -> Java SDK Commands 3、点击应用和确认 三、结果

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击&#xff0c;该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击&#xff0c;证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…

文件的随机读写函数:fseek

目录 函数介绍&#xff1a; fseek&#xff1a; 原型&#xff1a; 参数说明&#xff1a; int origin&#xff1a; 举例&#xff1a; 文件内容展示&#xff1a; 正常的使用fgetc函数&#xff1a; 结果&#xff1a; 使用了fseek之后&#xff1a; SEEK_SET :从开始位置进行…

VBA技术资料MF60:从二维变体数组中删除一列数据

【分享成果&#xff0c;随喜正能量】如果一个人能看破红尘&#xff0c;特别是如果能看破贪欲的本质&#xff0c;他的身心一定会非常自在&#xff0c;外在的气色会很好&#xff0c;内心也会非常安乐。如果一个人总是贪执某人&#xff0c;那他的戒律肯定不会清净&#xff0c;他的…

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 &#xff08;1&#xff09;官网 &#xff08;2&#xff09;网站或下属的子网站&#xff0c;依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

轮廓检测及透视变换

文章目录 注&#xff1a;代码来自b站&#xff1a;阿头目G # 导入工具包 import numpy as np import argparse import cv2# # 设置参数 # ap argparse.ArgumentParser() # ap.add_argument("-i", "--image", required True, # help "Path to the i…

flutter GetMaterialAPP unknownRoute 失效

这个问题。。。找了半天&#xff0c;最后去了 官网的ISSu找到了答案&#xff0c;分享给同样困惑的小伙伴们 为了让unknownRoute能成功工作, 你的initialRoute一定不能是/, 否则当有未定义的导航时, Get只会跳到initialRoute页面去了. GetPage 里面不要把root设置为“/” 页面&a…

支付宝支付模块开发

生成二维码 使用Hutool工具类生成二维码 引入对应的依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.5</version> </dependency><dependency><groupId>com.go…

Oracle表锁了怎么办?

最近同事在开发过程中&#xff0c;由于网络或电脑卡顿导致PLSQL执行 update 语句操作一直无响应。随后同事就将PLSQL关闭重新打开再次执行 update 语句。来来回回操作了多次。最终导致了表被锁定。 解决问题 1、查看锁表情况 ---1、查看那些表被锁住 select b.owner, b.objec…

学之思项目第一天-完成项目搭建

一、前端 拉下前端代码执行 npm i 然后执行npm run serve就行了 二、后端 搭建父子模块 因为这个涉及到前台以及后台管理所以使用父子模块 并且放置一个公共模块&#xff0c;放置公共的依赖以及公共的代码 2.1 搭建父子工程 这个可以使用直接一个个的maven模块&#xff…

【网络协议】UDP

UDP协议与TCP协议都是传输层协议&#xff0c;应用层把数据拷贝到传输层&#xff0c;后续动作由下层自行决定。 UDP协议端格式 16位 UDP 长度 , 表示整个数据报 (UDP 首部 UDP 数据 ) 的最大长度 ;&#xff08;也就是65535字节&#xff09; 如果校验和出错 , 就会直接丢弃 ; …

湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别

一、软件功能测试   软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言&#xff0c;功能测试会对软件的所有功能进行测试&#xff0c;以确保其满足用户的需求和预期。在进行功能测试时&#xff0c;根据需求规格说明书编写测试用例&#xff0c;并在测试…

初识Java 11-1 函数式编程

目录 旧方式与新方式 lambda表达式 方法引用 Runnable 未绑定方法引用 构造器方法引用 函数式接口 带有更多参数的函数式接口 解决缺乏基本类型函数式接口的问题 本笔记参考自&#xff1a; 《On Java 中文版》 函数式编程语言的一个特点就是其处理代码片段的简易性&am…

从零开始之了解电机及其控制(10)空间矢量理论

与一维数字转子位置不同&#xff0c;电流和电压都是二维的。可以在矩形笛卡尔平面中考虑这些尺寸。 用旋转角度和幅度来描述向量 虽然电流命令的幅度和施加的电压是进入控制器的误差项的函数&#xff0c;它们施加的角度是 d-q 轴方向的函数&#xff0c;因此也是转子位置的函数。…

目标追踪学习经验总结

标题目标追踪算法学习经验总结   最近对目标追踪算法进行了学习&#xff0c;以下是我的学习经验&#xff0c;如有不对之处&#xff0c;欢迎大家指正。 1、简介 1.1 定义 目标跟踪是通过分析视频图片序列&#xff0c;对检测出的各个候选目标区域实施匹配&#xff0c;定位出这…