opencv-29 Otsu 处理(图像分割)
Otsu 处理
Otsu
处理是一种用于图像分割的方法,旨在自动找到一个阈值,将图像分成两个类别:前景和背景。这种方法最初由日本学者大津展之(Nobuyuki
Otsu)在 1979 年提出
在 Otsu 处理中,我们通过最小化类别内方差或最大化类别间方差的方式来确定最佳阈值。具体步骤如下:
- 首先,计算图像的直方图,即统计图像中每个像素值的频数。
- 对于每个可能的阈值 T,将图像分成两个类别:小于等于 T 的像素为一个类别,大于 T 的像素为另一个类别。
- 对于每个阈值 T,计算两个类别的像素值的均值和方差。
- 使用类别内方差和类别间方差之间的比率(称为 Otsu 函数)来评估当前阈值的效果。Otsu 函数计算公式为:(类别间方差) / (类别内方差)。
- 找到使得 Otsu 函数最大化的阈值 T,这个阈值就是最佳阈值。
- 使用最佳阈值 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࿰…...
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…...
什么是强化学习?
📝什么是强化学习? 1. 📝监督,非监督,强化2. 📝非 i.i.d3. 📝强化学习基本形式4. 📝马尔可夫过程 🌟 强化学习(Reinforcement Learning,RL&#x…...
如何在Linux系统上安装cpolar内网穿透
如何在Linux系统上安装cpolar内网穿透 文章目录 如何在Linux系统上安装cpolar内网穿透 cpolar作为一款体积小巧却功能强大的内网穿透软件,不仅能够在多种环境和应用场景中发挥巨大作用,还能适应多种操作系统,应用最为广泛的Windows、Mac OS系…...
分布式软件架构——内容分发网络
内容分发网络(CDN,Content Distribution Network或Content Delivery Network) 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现…...
【HAL库】STM32CubeMX开发----STM32F407----LAN8720A----移植FreeModbus实现ModbusTCP
前言 本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A,移植FreeModbus实现ModbusTCP网口通信。 具体内容参考文章:【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 矩阵就是二维数组&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
【动态规划】B4336 [中山市赛 2023] 永别|普及+
B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦,梦里有一个字符串,这个字符串无论正着读还是倒着读都是一样的,例如: a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么,只记得…...
