首页 > 编程语言 >基于麻雀算法的Otsu图像多阈值分割(python)

基于麻雀算法的Otsu图像多阈值分割(python)

时间:2025-01-09 20:30:33浏览次数:3  
标签:... 分割 阈值 python tag 图像 Otsu

基于麻雀算法的Otsu图像多阈值分割(python)

文章目录


摘要:Otsu 方法是应用最广泛的图像分割法之一,该方法也叫最大类间方法阈值分割法,选择分割阈值的标准是图像的类间方差达到最大或者类内方差最小。Otsu 阈值分割法可以从单阈值扩展到多级阈值分割,多阈值分割图像时采用多个不同的阈值将图像分割为多个不同的区域或目标。将智能算法应用于多阈值的寻找,能大大加快算法的速度。

1.Otsu阈值分割法原理

Otsu 阈值分割法是日本学者 Otsu 提出来的。假设图像大小为 M × N M × N M×N,图像灰度级范围为 [ 0 , L - 1 ] [0,L - 1] [0,L-1], n i n_i ni​为图像灰度级 i i i 的像素点数,灰度级 i i i 出现的概率为: p i = n i / ( M × N ) p_i = n_i /(M × N) pi​=ni​/(M×N);对于单阈值分割,图像被分割为两类,灰度级为 [ 0 , T ] [0,T] [0,T]的像素点归为 C 0 C_0 C0​ 类,灰度级为 [ T + 1 , L - 1 ] [T + 1,L - 1] [T+1,L-1]的像素点为 C 1 C_1 C1​ 类。设 P 0 ( T ) 、 P 1 ( T ) P_0 (T)、P_1 (T) P0​(T)、P1​(T) 分别表示 C 0 C_0 C0​ 类和 C 1 C_1 C1​ 类的出现的概率; u 0 ( T ) , u 1 ( T ) u_0 (T),u_1 (T) u0​(T),u1​(T) 表示 C 0 C_0 C0​ 类和 C 1 C_1 C1​ 类的平均灰度级。则有:
P 0 ( T ) = ∑ i = 0 T p i (1) P_0(T)=\sum_{i=0}^{T}p_i\tag{1} P0​(T)=i=0∑T​pi​(1)

P 1 ( T ) = ∑ i = T + 1 L − 1 p i = 1 − P 0 ( T ) (2) P_1(T)=\sum_{i=T+1}^{L-1}p_i = 1 - P_0(T)\tag{2} P1​(T)=i=T+1∑L−1​pi​=1−P0​(T)(2)

u 0 ( T ) = ∑ i = 0 T ( i p i P 0 ( T ) ) (3) u_0(T)=\sum_{i=0}^T(i\frac {p_i}{P_0(T)})\tag{3} u0​(T)=i=0∑T​(iP0​(T)pi​​)(3)

u 1 ( T ) = ∑ i = T + 1 L − 1 ( i p i P 1 ( T ) ) (4) u_1(T)=\sum_{i=T+1}^{L-1}(i\frac {p_i}{P_1(T)})\tag{4} u1​(T)=i=T+1∑L−1​(iP1​(T)pi​​)(4)

图像的平均灰度级表示为:
u = ∑ i = 1 L i p i = P 0 ( T ) u 0 ( T ) + P 1 ( T ) u 1 ( T ) (5) u = \sum_{i=1}^{L}ip_i=P_0(T)u_0(T)+P_1(T)u_1(T)\tag{5} u=i=1∑L​ipi​=P0​(T)u0​(T)+P1​(T)u1​(T)(5)
图像的类间方差 δ b 2 ( T ) \delta_b^2(T) δb2​(T)表示为:
δ b 2 ( T ) = P 0 ( T ) ( u 0 ( T ) − u ) 2 + P 1 ( T ) ( u 1 ( T ) − u ) 2 (6) \delta_b^2(T)=P_0(T)(u_0(T) -u)^2+P_1(T)(u_1(T)-u)^2\tag{6} δb2​(T)=P0​(T)(u0​(T)−u)2+P1​(T)(u1​(T)−u)2(6)
图像的类内方差 δ w 2 ( T ) \delta_w^2(T) δw2​(T) 表示为
δ w 2 ( T ) = P 0 ( T ) u 0 2 ( T ) + P 1 ( T ) u 1 2 ( T ) (7) \delta_w^2(T)=P_0(T)u_0^2(T)+P_1(T)u_1^2(T)\tag{7} δw2​(T)=P0​(T)u02​(T)+P1​(T)u12​(T)(7)
当类间方差达到最大时该灰度级为最优分割阈值,即Otsu 阈值:
T ∗ = a r g m a x ( l ≤ T < L ) { δ b 2 ( T ) } (8) T^* = argmax_{(l\leq T<L)} \{\delta_b^2(T) \}\tag{8} T∗=argmax(l≤T<L)​{δb2​(T)}(8)
或者当类内方差达到最小时对应的阈值为最优分割阈值:
T ∗ = a r g m i n ( l ≤ T < L ) { δ w 2 ( T ) } (9) T^* = argmin_{(l\leq T<L)} \{\delta_w^2(T) \}\tag{9} T∗=argmin(l≤T<L)​{δw2​(T)}(9)
单阈值 Otsu 分割法可以扩展到多级阈值分割法。假设有 n − 1 n-1 n−1个阈值 T 1 , T 2 , . . . , T n − 1 T_1,T_2,...,T_{n-1} T1​,T2​,...,Tn−1​ 将图像分为 n n n类,表示为 C 0 = { 0 , 1 , . . . , T 1 } , . . . . , C n = { T n − 1 + 1 , T n − 1 + 2 , . . . , L − 1 } C_0=\{0,1,...,T_1\},....,C_n=\{T_{n-1}+1,T_{n-1}+2,...,L-1\} C0​={0,1,...,T1​},....,Cn​={Tn−1​+1,Tn−1​+2,...,L−1},各类出现的概率分别表示为 P 0 , P 1 , . . . , P n − 1 P_0,P_1,...,P_{n-1} P0​,P1​,...,Pn−1​,方差表示为 δ 0 2 , δ 1 2 , . . . , δ n − 1 2 \delta_0^2,\delta_1^2,...,\delta_{n-1}^2 δ02​,δ12​,...,δn−12​,均值为 u 0 , u 1 , . . . , u n − 1 u_0,u_1,...,u_{n-1} u0​,u1​,...,un−1​。

则有:
P k = ∑ i = T k T k + 1 − 1 p i (10) P_k = \sum_{i=T_k}^{T_{k+1}-1}p_i\tag{10} Pk​=i=Tk​∑Tk+1​−1​pi​(10)

u k = 1 P k P k ∑ i = T k T k + 1 − 1 i p i (11) u_k=\frac{1}{P_k}P_k\sum_{i=T_k}^{T_{k+1}-1}ip_i\tag{11} uk​=Pk​1​Pk​i=Tk​∑Tk+1​−1​ipi​(11)

δ k 2 = ∑ i = T k T k + 1 − 1 ( i − u k ) 2 p i P k (12) \delta_k^2=\sum_{i=T_k}^{T_{k+1}-1}(i-u_k)^2\frac{p_i}{P_k}\tag{12} δk2​=i=Tk​∑Tk+1​−1​(i−uk​)2Pk​pi​​(12)

其中 k = 0 , 1 , … , n − 1 ; T 0 = 0 , T n = L k = 0,1,…,n-1;T_0 = 0,T_n = L k=0,1,…,n−1;T0​=0,Tn​=L。则图像的类间方差表示为:
δ b 2 = ∑ i = 0 n − 1 P i δ i 2 (13) \delta_b^2=\sum_{i=0}^{n-1}P_i\delta_i^2\tag{13} δb2​=i=0∑n−1​Pi​δi2​(13)
多级最优分割阈值:
{ T 1 ∗ , T 2 ∗ , . . . , T n − 1 ∗ } = a r g m a x ( l ≤ T < L ) { δ b 2 } (14) \{T_1^*,T_2^*,...,T_{n-1}^*\} =argmax_{(l\leq T<L)} \{\delta_b^2 \} \tag{14} {T1∗​,T2∗​,...,Tn−1∗​}=argmax(l≤T<L)​{δb2​}(14)
或者:
{ T 1 ∗ , T 2 ∗ , . . . , T n − 1 ∗ } = a r g m i n ( l ≤ T < L ) { δ w 2 } (15) \{T_1^*,T_2^*,...,T_{n-1}^*\} =argmin_{(l\leq T<L)} \{\delta_w^2 \} \tag{15} {T1∗​,T2∗​,...,Tn−1∗​}=argmin(l≤T<L)​{δw2​}(15)

2.基于麻雀优化的多阈值分割

由上述Otsu阈值分割法的原理可知,要得到最终的阈值,需要去寻找阈值,使得类间方差值最大或类内方差值最小。于是可以利用智能优化算法进行阈值的寻优,使得获得最佳阈值。

于是优化的适应度函数就是:
f u n { T 1 ∗ , T 2 ∗ , . . . , T n − 1 ∗ } = a r g m a x ( l ≤ T < L ) { δ b 2 } (14) fun\{T_1^*,T_2^*,...,T_{n-1}^*\} =argmax_{(l\leq T<L)} \{\delta_b^2 \} \tag{14} fun{T1∗​,T2∗​,...,Tn−1∗​}=argmax(l≤T<L)​{δb2​}(14)
设置阈值分割的个数,寻优边界为0到255(因为图像的像素值范围为0-255),设置相应的麻雀算法参数。
麻雀算法原理请参考博客:https://blog.csdn.net/u011835903/article/details/108830958

3.算法结果:

''' 主函数 '''
I = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE) #以灰度图方式读取图像
# 优化算法参数设置
pop = 30  # 种群数量
MaxIter = 50  # 最大迭代次数
dim = 3  # 维度
lb = 0*np.ones([dim, 1])  # 下边界
ub = 255*np.ones([dim, 1])  # 上边界
fobj = fun
GbestScore, GbestPositon, Curve = SSA.SSA(pop, dim, lb, ub, MaxIter, fobj)

以lena图像为例,3阈值分割

请添加图片描述
请添加图片描述

4.参考文献:

[1]袁小翠,黄志开,马永力,刘宝玲.Otsu阈值分割法特点及其应用分析[J].南昌工程学院学报,2019,38(01):85-90+97.

5.Python代码:

标签:...,分割,阈值,python,tag,图像,Otsu
From: https://blog.csdn.net/JackYYMM/article/details/144954605

相关文章

  • python中的元类
    python中的元类正文什么是元类(Metaclass)?在Python中,类本身是对象,而创建类的机制是由元类(Metaclass)来控制的。元类可以被看作是“类的工厂”,它定义了类是如何被创建的。可以理解为,元类是用来创建类的类,而类则是用来创建实例的。简单来说,元类控制着类的创建过程,而类控制着对象......
  • Python基于flask的网络在线选课成绩管理系统
    文章目录具体实现截图系统设计开发技术项目技术介绍预期达到的目标核心代码部分展示文章目录/写作提纲参考参考文献源码/演示视频获取方式具体实现截图系统设计(1)数据库设计:设计一个高效的数据库结构,包括用户信息等数据表的设计,以及数据表之间的关联关系。(2)系......
  • 基于 Python 的水果销售系统设计与实现
    标题:基于Python的水果销售系统设计与实现内容:1.摘要本文介绍了一个基于Python的水果销售系统的设计与实现。首先,阐述了系统的背景和目的,即提高水果销售效率和管理水平。接着,详细描述了系统的设计思路和实现方法,包括数据库设计、界面设计和功能模块实现。然后,展示了系统......
  • 如何用python去保存文件后缀名
    用python保存文件后缀名的方法:1、splittext()方法2、endswith()方法path = "test_user_info.py"bool = path.endswith(".py")print(bool)3.用split方法切割path = "test_user_info.py"suffix = path.split(".")[1]print("suffix: {}&......
  • python | yagmail,一个实用的 Python 库!
    本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。原文链接:yagmail,一个实用的Python库!大家好,今天为大家分享一个实用的Python库-yagmail。Github地址:https://github.com/kootenpv/yagmail在自动化办公和数据驱动的工作流程中,自动发送电子邮件是一项常见的任务......
  • 如何用python编表白程序
    用python编表白程序的方法:1、创建GUI窗口,实现代码的调用。2、编写点击触发函数,实现表白程序。具体代码如下:from tkinter import *from tkinter import messageboxdef closeWindow():    messagebox.showinfo(title="警告",message="不许关闭,好好回答") ......
  • 2025最新Python安装教程+PyCharm安装教程(超详细!)看这一篇全都搞定!
    Python安装1、首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载。(免下载直接安装......
  • 如何安装python?超详细安装教程!
    首先,请确保你的系统是Windows-64位1.下载Python首先,打开浏览器,我们需要到Python的官方网站在地址栏输入python.org,然后点击页面上的“Downloads”按钮,接着选择适合你电脑系统的版本进行下载。如果是Windows或者Mac的小可爱们,直接下载推荐版本就好啦。小编下载的是python-3.7......
  • 《python基于时间序列分析的降雨量预测系统》毕业设计项目
    大家好我是君君学姐,混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于时间序列分析的降雨量预测系统》毕业设计项目。项目源码以及部署相关请联系君君学姐,文末附上联系信息。......
  • 《python基于循环神经网络的情感分类系统》毕业设计项目
    大家好我是君君学姐,混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于循环神经网络的情感分类系统》毕业设计项目。项目源码以及部署相关请联系君君学姐,文末附上联系信息。......