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

opencv-29 Otsu 处理(图像分割)

Otsu 处理

Otsu
处理是一种用于图像分割的方法,旨在自动找到一个阈值,将图像分成两个类别:前景和背景。这种方法最初由日本学者大津展之(Nobuyuki
Otsu)在 1979 年提出

在 Otsu 处理中,我们通过最小化类别内方差或最大化类别间方差的方式来确定最佳阈值。具体步骤如下:

  1. 首先,计算图像的直方图,即统计图像中每个像素值的频数。
  2. 对于每个可能的阈值 T,将图像分成两个类别:小于等于 T 的像素为一个类别,大于 T 的像素为另一个类别。
  3. 对于每个阈值 T,计算两个类别的像素值的均值和方差。
  4. 使用类别内方差和类别间方差之间的比率(称为 Otsu 函数)来评估当前阈值的效果。Otsu 函数计算公式为:(类别间方差) / (类别内方差)。
  5. 找到使得 Otsu 函数最大化的阈值 T,这个阈值就是最佳阈值。
  6. 使用最佳阈值 T 将图像进行分割,得到前景和背景。

Otsu 处理在图像分割中广泛应用,特别是在二值化图像中,可以有效地将图像分成前景和背景两部分,并且对于具有明显双峰直方图的图像效果较好。

Otsu 处理与自适应阈值得区别

Otsu 处理和自适应阈值是两种不同的图像阈值处理方法,它们在选择阈值的方式和应用场景上有所区别。

Otsu 处理:

Otsu 处理是一种全局阈值处理方法,它旨在找到一个适合整个图像的最佳阈值,将图像分成前景和背景两部分。这个最佳阈值是通过最大化类间方差或最小化类内方差来确定的,以使得前景和背景的差异最大化。
Otsu 处理适用于具有明显双峰直方图的图像,即图像中存在明显的前景和背景像素值的分界点。
Otsu 处理是一个全局方法,只使用图像的整体信息来确定阈值,因此不适用于具有局部不均匀光照或噪声的图像。

自适应阈值:

自适应阈值是一种局部阈值处理方法,它根据图像中的局部区域来确定每个像素的阈值。这样可以在图像中的不同区域应用不同的阈值,从而更好地处理具有局部不均匀光照或噪声的图像。
自适应阈值的计算过程是基于图像中每个像素周围的局部邻域进行的,可以通过选择不同的算法(例如平均值、高斯加权平均值等)来计算局部阈值。
自适应阈值适用于具有非均匀光照或有噪声的图像,可以提高阈值处理的准确性和效果。

综上所述,Otsu 处理是一种全局阈值处理方法,适用于具有明显双峰直方图的图像;而自适应阈值是一种局部阈值处理方法,适用于具有非均匀光照或噪声的图像。在实际应用中,我们根据图像的特点选择合适的阈值处理方法,以获得最佳的图像分割结果。

代码示例:

在使用函数 cv2.threshold()进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据。通常情况下处理的图像都是色彩均衡的,这时直接将阈值设为 127 是比较合适的。

但是,有时图像灰度级的分布是不均衡的,如果此时还将阈值设置为 127,那么阈值处理的结果就是失败的。例如,有一个图像 img,里面的像素值为:

[[123 123 123 123 123]
[123 123 123 123 123]
[123 123 126 126 126]
[123 123 126 126 126]
[123 123 126 126 126]]

此时,如果仍然以 127 作为阈值,那么阈值处理结果是:

[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]

很显然,这不是我们想要的结果。我们可以观察到,对于 img,如果以阈值 125 进行分割,可以得到较好的结果:

[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 255 255 255]
[ 0 0 255 255 255]
[ 0 0 255 255 255]]

但是,实际处理的图像往往是很复杂的,不太可能像上述 img 那样,一眼就观察出最合适的阈值。

如果一个个去尝试,工作量无疑是巨大的。

Otsu 方法能够根据当前图像给出最佳的类间分割阈值。简而言之,Otsu 方法会遍历所有可能阈值,从而找到最佳的阈值。

在 OpenCV 中,通过在函数 cv2.threshold()中对参数 type 的类型多传递一个参数,“cv2.THRESH_OTSU”,即可实现 Otsu 方式的阈值分割。

需要说明的是,在使用 Otsu 方法时,要把阈值设为 0。此时的函数 cv2.threshold()会自动寻找最优阈值,并将该阈值返回。

例如,下面的语句让函数 cv2.threshold()采用 Otsu 方法进行
阈值分割:

t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

与普通阈值分割的不同之处在于:

 参数 type 增加了一个参数值“cv2.THRESH_OTSU”。
 设定的阈值为 0。
 返回值 t 是 Otsu 方法计算得到并使用的最优阈值。
需要注意,如果采用普通的阈值分割,返回的阈值就是设定的阈值。

例如下面的语句设定
阈值为 127,所以最终返回的就是 t=127。

t,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)

测试 Otsu 阈值处理的实现。

import cv2
import numpy as np
img = np.zeros((5,5),dtype=np.uint8)
img[0:6,0:6]=123
img[2:6,2:6]=126
print("img=\n",img)
#普通设定阈值
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print("thd=\n",thd)
print("设定得阈值 t1=\n",t1)
#otsu设定阈值
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print("otsu 自动获取得阈值 t2=\n",t2)
print("otsu=\n",otsu)

运行结果如下:

img=[[123 123 123 123 123][123 123 123 123 123][123 123 126 126 126][123 123 126 126 126][123 123 126 126 126]]
thd=[[0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0]]
设定得阈值 t1=127.0
otsu 自动获取得阈值 t2=123.0
otsu=[[  0   0   0   0   0][  0   0   0   0   0][  0   0 255 255 255][  0   0 255 255 255][  0   0 255 255 255]]

总结果中我们可以找到上面自动阈值取到了123.找到了最佳得阈值.

对于像素数组得这个最佳阈值体没有感观得效果,我们接下来找个图片来看看 otsu 阈值处理得效果
代码如下:

import cv2
img=cv2.imread("tiffany.bmp",0)
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("img",img)
cv2.imshow("thd",thd)
cv2.imshow("otus",otsu)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果如下,从效果中来看结果还是很明显得.otsu 得效果明显比自定义得阈值处理效果要好很多.
在这里插入图片描述

相关文章:

opencv-29 Otsu 处理(图像分割)

Otsu 处理 Otsu 处理是一种用于图像分割的方法,旨在自动找到一个阈值,将图像分成两个类别:前景和背景。这种方法最初由日本学者大津展之(Nobuyuki Otsu)在 1979 年提出 在 Otsu 处理中,我们通过最小化类别内…...

网络中通过IP地址查找位置

display ip routing-table 查看路由表 display vlan 查看vlan 信息 display stp brief 查看生成树信息 display mac-address 查看mac 地址表 display arp 查看arp表 SW1 SW2...

MyBatis的动态SQL语句

文章目录 前言LocalDate数据库代码po 包 ifwhere 标签 查trim 标签 增set 标签 改foreach 标签 删 前言 提示:这里可以添加本文要记录的大概内容: 查询条件是动态的 MyBatis的动态SQL语句是指在运行时根据不同条件选择不同的SQL语句执行。 这些条件可…...

交互式AI技术与模型部署:bert-base-chinese模型交互式问答界面设置

使用Gradio实现Question Answering交互式问答界面,首先你需要有一个已经训练好的Question Answering模型,这里你提到要使用bert-base-chinese模型。 Gradio支持PyTorch和TensorFlow模型,所以你需要将bert-base-chinese模型转换成PyTorch或Te…...

Edge浏览器安装vue devtools

1. 下载地址 GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications. 2. 下载后的压缩包解压并打开文件夹,右键选择:git bush here 3. 安装依赖 npm install 4. 成功安装依赖后打包 npm run build...

zookeeper基础

安装 https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/ 命令 bin/zkServer.sh start bin/zkServer.sh stop bin/zkServer.sh status bin/zkCli.sh ll / quit 各个配置项的含义: tickTime:每个时钟周期的毫秒数。ZooKeeper使用一个内部…...

【C++】类与对象(2)

文章目录 前言一、类的6个默认成员函数二、构造函数1.概念2.特性3.初始化列表 三、析构函数1.概念2.特性 四、拷贝构造函数1.概念2.特性 五、赋值运算符重载1.运算符重载2.赋值运算符重载3.前置和后置重载 六、取地址及const取地址操作符重载总结 前言 在前面,给大…...

数据结构——绪论

一、绪论 (一)基本概念 数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整…...

Docker Dockerfile 语法与指令

一、简介 Docker 镜像原理、容器转成镜像 随便找个案例,进入 https://hub.docker.com/ 搜索 centos,然后随便找个版本(例如:centos7)点击一下,就会进入 centos7 的 dockerfile 文件: // 空镜像…...

【LeetCode每日一题】——566.重塑矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 566.重塑矩阵 四【题目描述】 在 MATLAB 中&…...

Manim(一款强大的数学可视化动画引擎)学习历程

相逢情便深,恨不相逢早 第一眼看见上面这种类型的视频我就深深被它的简约清楚所折服,我觉得它完全符合我的审美,我也相信只要了解过制作这种视频的软件的人都会喜欢上它。运用这种风格比较有名的是b站里的一位up主名叫3Blue1Brown&#xff0…...

powershell脚本写一个托盘图标

1、准备ico格式图标 star_bethlehem_icon 文件名改为star.ico 2、安装VSCode 如何下载安装VSCode 扩展:PowerShell扩展 3、创建项目 1、运行PowerShell命令 mkdir trayicon_ps1;cd trayicon_ps1;New-Item trayicon.ps1;code .2、将star.ico放入trayicon_ps1文…...

前端Vue入门-day08-vant组件库

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 vant 组件库 安装 导入 全部导入 按需导入 浏览器配饰 Viewport 布局 Rem 布局适配 vant 组件库 …...

华为OD机考--【磁盘容量排序】

■ 题目描述 【磁盘容量排序】 磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T 1024G,1G 1024M,现在给定n块磁盘的容量, 请对它们按从小到大的顺序进行稳定排序,例如给定5…...

实现弧形切角两种方式

1、css 的 radial-gradient <view style"padding:30px; background: #ccc;"><view class"navActive"></view> </view>.navActive{width: 200px;height: 40px;background-color: #fff;color: rgb(0,63,136);position: relative;bor…...

什么是强化学习?

&#x1f4dd;什么是强化学习&#xff1f; 1. &#x1f4dd;监督&#xff0c;非监督&#xff0c;强化2. &#x1f4dd;非 i.i.d3. &#x1f4dd;强化学习基本形式4. &#x1f4dd;马尔可夫过程 &#x1f31f; 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#x…...

如何在Linux系统上安装cpolar内网穿透

如何在Linux系统上安装cpolar内网穿透 文章目录 如何在Linux系统上安装cpolar内网穿透 cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系…...

分布式软件架构——内容分发网络

内容分发网络&#xff08;CDN&#xff0c;Content Distribution Network或Content Delivery Network&#xff09; 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现…...

【HAL库】STM32CubeMX开发----STM32F407----LAN8720A----移植FreeModbus实现ModbusTCP

前言 本次实验以 STM32F407VET6 芯片为MCU&#xff0c;使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A&#xff0c;移植FreeModbus实现ModbusTCP网口通信。 具体内容参考文章&#xff1a;【HAL库】STM32CubeMX开发----STM32F407----ETHLAN8720ALWIP----ping通 本次移植…...

11-矩阵(matrix)_方阵_对称阵_单位阵_对角阵

矩阵及其运算 [ a 11 ⋯ a 1 n ⋯ ⋯ ⋯ a m 1 ⋯ a m n ] \begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \cdots & \cdots & \cdots \\ a_{m1} & \cdots & a_{mn} \\ \end{bmatrix} ​a11​⋯am1​​⋯⋯⋯​a1n​⋯amn​​ ​ 矩阵就是二维数组&…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...