10 Otsu 算法

article/2025/8/18 23:00:00

文章目录

  • 前言
  • 一、Otsu 是什么?
  • 二、算法实验
    • 1.使用第三方库
    • 2.不使用第三方库


前言

Otsu 是一种利用图像的灰度特征自动计算二值化阈值的方法,常被称为 Otsu 自动阈值法。

使用 Otsu 方法可以避免主观性和繁琐性的阈值选取操作,并能够在一定程度上提高图像分割的准确性和鲁棒性。因此,在实际应用中,Otsu 方法被广泛应用于图像分割、字符识别、人脸识别等领域。

一、Otsu 是什么?

在图像处理中,二值化是一种非常基础的操作,其作用是将灰度图像转为黑白图像。在二值化过程中,需要根据一定阈值将图像的各个像素分为两类,可以根据问题的具体需求,选取不同的二值化阈值来实现图像分割。

Otsu 方法通过最小化图像类内方差和类间方差的加权和,求出一个最优的阈值,从而实现自动计算二值化阈值的目的。这个阈值能够使得分割后的图像的目标物体与背景类间差别最大,而目标物体内部差别最小。

二、算法实验

1.使用第三方库

代码如下(示例):

import cv2# 读取灰度图像
img = cv2.imread('test.jpg', 0)
# 使用 Otsu 自动阈值法计算阈值
threshold_value, threshold_image = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 显示二值化图像
cv2.imshow('Binary Image', threshold_image)
# 等待用户按下任意按键退出程序
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()

效果图如下:
在这里插入图片描述

2.不使用第三方库

Otsu 方法的核心思想就是最小化图像的类内方差和类间方差的加权和,使得在该阈值下,前景(即目标物体)与背景之间距离最大,而前景内部(即目标物体内部)的距离最小。
具体实现方法如下:

1、根据给定的阈值 T,将图像分为两类:前景(目标物体)和背景。这里我们以二值化为例,将图像中所有灰度值大于阈值 T 的像素标记为前景,其他像素标记为背景。

2、分别计算前景和背景的像素值平均值 μ0 和 μ1,在此基础上计算出总平均值 μ。

3、计算前景和背景的类内方差 σ0^2 和 σ1^2,根据公式 σ^2 = Σ((x-μ)^2)/N 计算,其中 x 为像素值,μ 为像素值平均值,N 为像素数量。

4、计算类间方差 δ^2,根据公式 δ^2 = w0 * w1 * (μ0 - μ1)^2 计算,其中 w0 和 w1 分别为前景和背景像素数量占总像素数量的比例。

5、将所有可能的阈值 T 都遍历一遍,找到使类间方差 δ^2 最大的阈值 T。这样就找到了最佳阈值,可以用于对图像进行二值化处理。

在实现时,我们可以计算每个像素灰度值的直方图,并根据Otsu方法计算出最佳的阈值,然后将图像转化为二值图像。Otsu 方法非常适合在对比度较明显的图像中使用,可以有效地分离背景和前景,提高图像处理的准确性和效率。

代码如下(示例):

img = cv2.imread("lena.bmp",0)# 计算像素值的直方图hist = np.histogram(img, bins=256)[0]# 分别计算前景和背景的像素数量和像素值总和pixels_total = np.sum(hist)pixels_sum = np.dot(np.arange(256), hist)# 初始化最大类间方差和最佳阈值max_variance = 0best_threshold = 0# 遍历所有可能的阈值,计算类间方差并更新最佳阈值for threshold in range(256):w0 = np.sum(hist[:threshold]) / pixels_totalw1 = 1 - w0if w0 == 0 or w1 == 0:continuemu0 = np.sum(np.arange(threshold) * hist[:threshold]) / (pixels_total * w0)mu1 = np.sum(np.arange(threshold, 256) * hist[threshold:]) / (pixels_total * w1)variance = w0 * w1 * (mu0 - mu1) ** 2if variance > max_variance:max_variance = variancebest_threshold = thresholdnew_img = (img > best_threshold).astype(np.uint8) * 255cv2.imshow('OTSU', new_img)

效果图如下;可以看到效果跟第三方库的效果差不多。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/BNC9o2AG.shtml

相关文章

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

OTSU是阈值分割中一种常用的算法,它可以根据图像自动生成最佳分割阈值。OTSU的核心思想是类间方差最大化。 import cv2 import numpy as np from matplotlib import pyplot as pltimage cv2.imread("2.bmp") gray cv2.cvtColor(image, cv2.COLOR_BGR2G…

Bootstrap模态框里 再弹模态框

Bootstrap模态框里 再弹模态框 后端代码点击编辑 按钮 将参数赋值隐藏 input 中 , 便于修改 获取对应id修改模态框详情模态框 后端代码 /*** 财务审核使用详情** param request* param id* return*/RequestMapping(params "getUseDatil")ResponseBodypublic JSONAr…

新增模态框

平时我们在VS中也常常会用到模态框,今天我们就来聊聊模态框,但是我要说的是新增模态框,而不是修改模态框喔。在书写模态框代码时,我们还要引用一个插件: 然后就可以进行对代码进行书写了。 我们先说说模态框插件的用法&#xff0c…

html模态框常见问题,模态框无法弹出的问题

问题起因: 昨晚写到了一个模态框,用到了bootstrap和jquery,依赖的js已经复制到项目中,并在Jsp页面上进行了引用,最初的引用如下: 问题描述: 模态框无法正常弹出,使用浏览器查看资源看…

Vue模态框的封装

一、模态框 1、模态框:若对话框不关闭,不能操作其父窗口 2、非模态框:对话框不关闭,可以操作其窗口 二、Vue组件实现模态框的功能 1、模态框是一个子组件 2、显示和隐藏由父组件决定 3、对话框的标题也是由父组件传递的 4、对话框…

Bootstrap之模态框

前言 模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。 用法 您可以切换模态框(Modal)插件的隐藏内…

php什么是模态框,bootstrap模态框有什么用

Bootstrap Modals(模态框)是使用定制的Jquery 插件创建的。 它可以用来创建模态窗口丰富用户体验,或者为用户添加实用功能。您可以在 Modals(模态框)中使用 Popover(弹出框)和 Tooltip(工具提示插件)。(推荐学习:Bootstrap视频教程) 将通过一些实例和解释…

弹出模态框

想必大家都知道弹出层的重要性,在很多的地方都能用到这个方法,所以说这种是非常的普遍的实用性,在大家编写过程中也是很常见的模态框以及弹出层,基本也是一个概念。 插件不可缺少 1.多窗口模式 层叠置顶 Esc 关闭 为什么是说多窗…

模态框动态赋值

模态框动态赋值,可以有多种方式:1、每次一个个填充;2、直接针对模态框中的ID赋值。。。 今天说下同事犯的错误,大家引以为鉴: 首先如图: 他在点击详情链接时,是能拿到相关参数的,进…

html 自定义模态框,自定义对话框、模态框

致敬iphoneX的小刘海....自定义模态框 body{ text-align: center; } #modalBg{ position: absolute; left: 0; top: 0; background-color: rgba(0,0,0,0.2); width: 100%; height: 100%; margin: auto; display: none; } #modal{ min-width: 30%; background-color: white; bor…

html怎么自动弹出模态框,纯CSS实现带点击模态框外部自动关闭的模态框

在网页中我们经常会用到模态框,一般会用于显示表单或者是提示信息。由于模态框涉及到页面上比较多的交互效果,最简单的交互就是打开以及关闭两个操作,而关闭又会涉及是否需要在打开状态下点击模态框外部能够关闭这样的功能,因为这些交互问题,所以一般都会首先考虑到使用Ja…

模态框拖拽

1、点击弹出层,回弹出模态框,并且显示半透明的遮挡层 2、点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层 3、鼠标放到模态框最上面一行,可以按住鼠标拖拽模态框在页面中移动 4、鼠标松开,可…

模态框案例

模态框 模态框在很多网站是很常见的&#xff0c;比如网易云音乐登录&#xff0c;百度登录等网站。 网易云音乐如图&#xff1a; 让我们来看看代码吧&#xff01;&#xff01;注意&#xff1a;这里为了更好的演示效果&#xff0c;增加了遮挡层。 HTML部分&#xff1a; <!-- …

零基础Bootstrap入门教程(16)--模态框

点此查看 所有教程、项目、源码导航 本文目录 1. 概述2. 模态框样式3. 按钮直接关联模态框4. 通过JS方法打开/关闭模态框5. 调整大小6. 动画效果7. 小结 1. 概述 模态框这个名字有点高雅了&#xff0c;其实就是对话框&#xff0c;用来弹出一个新的界面。 模态框的使用非常的场…

模态框

模态对话框&#xff08;Modal Dialogue Box&#xff0c;又叫做模式对话框&#xff09;&#xff0c;是指在用户想要对对话框以外的应用程序进行操作时&#xff0c;必须首先对该对话框进行响应 摘自百度百科 先放上效果图&#xff1a; 基本功能为点击窗口中间的发光按钮&#xff…

HTML+CSS+JavaScript实现模态框(可拖拽)

前言 模态框是指覆盖在父窗口上的子窗口&#xff0c;但在HTML网页中&#xff0c;并没有父窗口和子窗口的概念。这里是通过可隐藏的遮罩层和一个可隐藏的盒子来实现模态框的效果。 效果演示&#xff1a; 下面开始详细介绍如何实现一个可拖拽的模态框。只对 JS 部分详解&#x…

Bootstrap系列之模态框(Modal)

文章の目录 1、工作原理2、示例2.1、Modal组件2.2、在线演示2.3、静态背景2.4、滚动内容2.5、垂直居中2.6、提示和弹窗2.7、使用网格2.8、不同模态框的内容2.9、改变动画2.10、移除动画2.11、动态高度2.12、Accessibility2.13、嵌入YouTube视频 3、Optional sizes4、用法4.1、通…

Oracle数据迁移

本文主要提及使用exp,imp以及Oracle数据泵等工具如何进行数据迁移&#xff1a; 一、数据迁移工具 1、数据迁移工具 &#xff08;1&#xff09;数据泵 &#xff08;2&#xff09;外部表&#xff1a;external table &#xff08;3&#xff09;数据加载工具&#xff1a;sqllo…

MySQL数据库- 几种数据迁移的方法详解都在这了!看完必懂

数据迁移的几种方式 - MySQL数据库 本文关键字&#xff1a;MySQL、数据库、数据迁移、导入、导出 文章目录 数据迁移的几种方式 - MySQL数据库 一、数据迁移 1. 数据的生命周期2. 数据迁移的发生二、数据导出 1. 命令方式2. 软件方式三、数据导入 1. 命令方式2. 软件方式四、…

数据迁移方法

在我的《高并发系统设计目标之可扩展性》博文中提到&#xff0c;随着业务的发展&#xff0c;我们会沿着AKF的Y轴进行微服务化的改造。但是沿着Y轴的重构过程中往往涉及到分库分表。那么这时就需要进行数据库的迁移了。沿着AKF的Z轴也类似&#xff0c;那么迁移有什么原则呢&…