OTSU算法原理与Python实现:图像二值化的自动阈值分割

article/2025/6/22 1:09:40

1 引言

        图像二值化是计算机视觉中的基础操作,它将灰度图像转换为黑白图像,常用于文档扫描、目标检测等任务。OTSU算法(大津法)是一种自动确定二值化阈值的算法,无需人工干预,通过最大化类间方差来分离前景和背景。本文将深入讲解OTSU的原理,并用Python实现完整的二值化流程。

2 原理

2.1 符号定义

        OTSU算法的目标是找到一个阈值 k,将图像像素分为两类:

  • C1类:像素值 ≤ k(背景)

  • C2类:像素值 > k(前景)

        定义以下变量:

  • p1、p2:C1和C2类的像素占比(概率)。

  • m1​、m2:C1和C2类的平均灰度值。

  • mG:图像全局平均灰度值。

2.2 公式推导

        根据均值的定义,全局均值 mG是两类均值的加权和:

p_1m_1+p_2m_2=m_G

        注:p_1+p_2=1

        类间方差(Between-class Variance)衡量两类之间的分离程度,定义为:

\sigma ^{2}_b=p_1(m_1-m_G)^{2}+p_2(m_2-m_G)^{2}

        化简得到

\sigma ^{2}_b=p_1p_2(m_1-m_2)^{2}

3 代码实现

3.1 代码

import cv2
import numpy as np
import time
import matplotlib.pyplot as plt
from PIL import Imagedef otsu_threshold(img):img_array = np.array(img)#计算直方图hist, _ = np.histogram(img_array,256,[0,256])#归一化直方图hist_norm = hist / float(np.sum(hist))#初始化best_threshold = 0max_variance = 0for threshold in range(256):w0 = np.sum(hist_norm[:threshold])w1 = np.sum(hist_norm[threshold:])if w0 == 0 or w1 ==0:continuem0 = np.sum(np.arange(0, threshold) * hist_norm[:threshold]) / w0m1 = np.sum(np.arange(threshold, 256) * hist_norm[threshold:]) / w1#计算类间方差variance = w0 * w1 * (m0 - m1) ** 2# 更新最佳阈值if variance > max_variance:max_variance = variancebest_threshold = thresholdreturn best_thresholddef apply_otsu(image_path,output_path=None):#打开图像转为灰度img = Image.open(image_path).convert('L')threshold = otsu_threshold(img)binary_img = img.point(lambda p:255 if p>threshold else 0)if output_path:binary_img.save(output_path)return binary_img, thresholdif __name__ == '__main__':image_path="test.png"output_path="output.png"binary_img, threshold = apply_otsu(image_path,output_path)binary_img.show()

3.2 实验结果展示

输入图片
输出图片

4 小结

        OTSU算法通过最大化类间方差实现自动阈值选择,适合双峰直方图的图像。本文提供了从原理到实现的完整流程。


http://www.hkcw.cn/article/VrrDWuBhot.shtml

相关文章

python:批量创建文件

#需求:在指定路径下批量创建3000#可以先弄个10个文本文件,文件格式为序号——物资类别——用户识别码组成 #1.序号从0001到3000 #2.物资类别包括:水果,烟酒,粮油,肉蛋,蔬菜 #3.用户识别码为9位的…

kafka学习笔记(三、消费者Consumer使用教程——配置参数大全及性能调优)

本章主要介绍kafka consumer的配置参数及性能调优的点,其kafka的从零开始的安装到生产者,消费者的详解介绍、源码及分析及原理解析请到博主kafka专栏 。 1.消费者Consumer配置参数 配置参数默认值含义bootstrap.servers无(必填)…

静态综合实验

题目 1.划分IP地址 因为所有网段基于192.168.1.0/24,所以需要自己进行合理的划分。如图,我已经划分完成。 2.启动 3.给五个路由器进行改名 4.给网关写入IP地址 R1 R2 R3 R4 5.完成网段的声明和环回接口的创建 6.在R1上进行ping,观察是否…

流媒体基础解析:音视频封装格式与传输协议

在视频处理与传输的完整流程中,音视频封装格式和传输协议扮演着至关重要的角色。它们不仅决定了视频文件的存储方式,还影响着视频在网络上的传输效率和播放体验。今天,我们将深入探讨音视频封装格式和传输协议的相关知识。 音视频封装格式 什…

保持本地 Git 项目副本与远程仓库完全同步

核心目标: 保持本地 Git 项目副本与 GitHub 远程仓库完全同步。 关键方法: 定期执行 git pull 命令。 操作步骤: 进入项目目录: 在终端/命令行中,使用 cd 命令切换到你的项目文件夹。执行拉取命令: 运行…

Go语言的context

Golang context 实现原理 本篇文章是基于小徐先生的文章的修改和个人注解,要查看原文可以点击上述的链接查看 目前我这篇文章的go语言版本是1.24.1 context上下文 context被当作第一个参数(官方建议),并且不断的传递下去&…

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷3:共计6题带解析)

2025年全国青少年信息素养大赛复赛C++算法创意实践挑战赛真题模拟强化训练(试卷3:共计6题带解析) 第1题:四位数密码 【题目描述】 情报员使用4位数字来传递信息,同时为了防止信息泄露,需要将数字进行加密。数据加密的规则是: 每个数字都进行如下处理:该数字加上5之后除…

NeRF PyTorch 源码解读 - 体渲染

文章目录 1. 体渲染公式推导1.1. T ( t ) T(t) T(t) 的推导1.2. C ( r ) C(r) C(r) 的推导 2. 体渲染公式离散化3. 代码解读 1. 体渲染公式推导 如下图所示,渲染图像上点 P P P 的颜色值 c c c 是累加射线 O P → \overrightarrow{OP} OP 在近平面和远平面范围…

Sentiment analysis integrating LangGraph and large-scale conceptual models

Sentiment analysis integrating LangGraph and large-scale conceptual models 核心目标: 让电脑更聪明地理解大量用户评论(比如邮件、社交媒体、调查问卷),自动分析出大家是夸还是骂(情感分析)&#xff…

DeepSeek R1-0528:深度思考能力的重大跃升与技术突破全解析

引言 2025年5月28日,DeepSeek再次以其标志性的"深夜发布"方式,悄然推出了R1模型的最新版本——DeepSeek-R1-0528。这次被官方定义为"小版本升级"的更新,实际上带来了令人瞩目的性能提升。新版本不仅在数学、编程与通用逻…

Python 训练营打卡 Day 40

训练和测试的规范写法 一、黑白图片的规范写法,以MNIST数据集为例 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 用于加载MNIST数据集 from torch.utils.data import DataLoader # 用于创建…

题海拾贝:P8598 [蓝桥杯 2013 省 AB] 错误票据

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

AI炼丹日志-26 - crawl4ai 专为 AI 打造的爬虫爬取库 上手指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…

homework 2025.03.31 chinese(class 3)

homework 2025.03.31 chinese&#xff08;class 3&#xff09; 三年级语文&#xff0c;古代十二时辰 ➠1. 子时&#xff08;23-1时&#xff09; “月落乌啼霜满天&#xff0c;江枫渔火对愁眠。姑苏城外寒山寺&#xff0c;夜半钟声到客船。” — 张继《枫桥夜泊》 子时夜深人静&…

若依框架定制化服务搭建

1.背景 若依框架是1套微服务框架&#xff0c;该服务在应用过程中少不了新增微服务来应对业务的需求&#xff0c;本次文档主要是针对若依框架的定制化微服务的搭建进行步骤的拆解。 2.ruoyi-api模块新建模块【report】 2.1 右键【ruoyi-api】&#xff0c;New一个Module 2.2 新…

【HW系列】—溯源与定位—Linux入侵排查

文章目录 一、Linux入侵排查1.账户安全2.特权用户排查&#xff08;UID0&#xff09;3.查看历史命令4.异常端口与进程端口排查进程排查 二、溯源分析1. 威胁情报&#xff08;Threat Intelligence&#xff09;2. IP定位&#xff08;IP Geolocation&#xff09;3. 端口扫描&#x…

JS入门——变量的类型、特殊符号、类型转化规则

JS入门——变量的类型、特殊符号、类型转化规则 一、变量类型 1.1总述 1.2代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>// tyoeo可以检测出类型aler…

手写HashMap

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于一个b站up的课程&#xff1a;https://www.bilibili.com/video/BV1SWZrYDEag?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 手写简单的HashMap 这里…

MySQL强化关键_018_MySQL 优化手段及性能分析工具

目 录 一、优化手段 二、SQL 性能分析工具 1.查看数据库整体情况 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;说明 2.慢查询日志 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;开启慢查询日志功能 &#xff08;3&#xff09;实例 3.s…

VMware-workstation安装教程--超详细(附带安装包)附带安装CentOS系统教程

VMware-workstation安装教程--超详细&#xff08;附带安装包&#xff09;附带安装CentOS系统教程 一、下载软件VMwware二、下载需要的镜像三、在VMware上安装系统 一、下载软件VMwware 二、下载需要的镜像 三、在VMware上安装系统 VMware 被 Broadcom&#xff08;博通&#x…