大津法图像分割 python手写算法 没用cv2

news/2024/11/15 7:23:31/

文章目录

          • 1. 基本概念
          • 2. 公式
            • 2.1 后景像素比w0
            • 2.2 前景像素比w1
            • 2.3 后景平均灰度u0
            • 2.4 前景平均灰度u1
            • 2.5 公式汇合
          • 3. 代码

1. 基本概念

用大津法最终会得到一个阈值,使用该阈值将图像进行二值化。大于这个阈值的,像素值变成1;小于阈值的,像素值变成0。 原本图像的像素范围是从0~255,大津法的思想很简单,就是遍历这256个阈值,对每个阈值,都进行一次二值化。最终看哪个阈值下二值化的结果最合适。接下来就介绍遍历的公式。

2. 公式

这里我将像素值为1的称作前景,像素值为0的称作后景。
大津法的最终公式为很多小的计算拼起来的,如下

2.1 后景像素比w0

ω 0 = 后景像素数量 图像宽 ∗ 图像高 (1) \omega_0= \frac{后景像素数量}{图像宽 *图像高}\tag{1} ω0=图像宽图像高后景像素数量(1)

2.2 前景像素比w1

ω 1 = 前景像素数量 图像宽 ∗ 图像高 (2) \omega_1= \frac{前景像素数量}{图像宽 *图像高}\tag{2} ω1=图像宽图像高前景像素数量(2)

2.3 后景平均灰度u0

μ 0 = ∑ a l l 后景像素的值 后景像素数量 (3) \mu_0 =\frac{ \sum_{all}后景像素的值}{后景像素数量}\tag{3} μ0=后景像素数量all后景像素的值(3)

2.4 前景平均灰度u1

μ 1 = ∑ a l l 前景像素的值 前景像素数量 (4) \mu_1 =\frac{ \sum_{all}前景像素的值}{前景像素数量}\tag{4} μ1=前景像素数量all前景像素的值(4)

2.5 公式汇合

根据式1~4,可以得到(5)
μ = ω 0 ∗ μ 0 + ω 1 ∗ μ 1 、 (5) \mu = \omega_0*\mu_0 + \omega_1*\mu_1 、\tag{5} μ=ω0μ0+ω1μ1(5)
其中 μ \mu μ是图像的平均灰度

而大津法的公式为
g = ω 0 ∗ ( μ 0 − μ ) 2 + ω 1 ∗ ( μ 1 − μ ) 2 (6) g = \omega_0*(\mu_0-\mu)^2 + \omega_1*(\mu_1-\mu)^2 \tag{6} g=ω0(μ0μ)2+ω1(μ1μ)2(6)
将(5)带(6),可以得到(7)
g = ω 0 ω 1 ( μ 0 − μ 1 ) 2 (7) g = \omega_0\omega_1(\mu_0-\mu_1)^2 \tag{7} g=ω0ω1(μ0μ1)2(7)

3. 代码

代码部分中,上述的公式都会体现出来。已经被注释所标注。

import numpy as np
import math'''
Summary:大津阈值分割
Paramaters:img - 输入的灰度图像 是二维矩阵
'''
def OTSU(img):# 类间方差g初始最小g_raw = -1# 要返回的阈值T_return = 0# 获得图像大小M_N = img.shape[0]*img.shape[1]# 大津阈值算法for T in range(256):# 获取阈值大于T和小于T的两个列表array0 = img[img<T] array1 = img[img>T]# 算出w0和w1w0 = len(array0)/M_N  # 公式1w1 = len(array1)/M_N  # 公式2# 算出μ0和μ1 这里需要特判除数为0if len(array0) == 0:mu0 = 0else:mu0 = sum(array0)/len(array0) # 公式3if len(array1) == 0:mu1 = 0else:mu1 = sum(array1)/len(array1)  # 公式4# 算出gg=w0*w1*math.pow((mu0-mu1),2)  # 公式6if g > g_raw:g_raw = gT_return = Treturn T_return

使用该图进行测试,效果如下所示
请添加图片描述

import cv2# 读取图片
img = Image.open('2.png')
# 转换成灰度图
img=img.convert('L')
# 转换成array
arr = np.array(img)
# # 获得最佳域值分割
T = OTSU(arr)
print(T)
# 根据阈值进行二值分割
arr[arr>T] = 255
arr[arr<T] = 0
# 展示分割结果
pil_image=Image.fromarray(arr)
pil_image

在这里插入图片描述


http://www.ppmy.cn/news/630492.html

相关文章

HMMER安装使用的简单流程

HMMER安装使用 安装 $ wget http://eddylab.org/software/hmmer/hmmer-3.3.2.tar.gz $ tar xf hmmer-3.3.2.tar.gz $ cd hmmer-3.3.2设置环境 $ ./configure --prefix/your/install/path $ make $ sudo make install可以下载从Easel library下载miniapps&#xff08;执行的话…

第12章 多播和多播路由选择协议

第12章 多播和多播路由选择协议 单播&#xff1a;只有一个源点网络和一个终点网络。源点网络和终点网络的关系是一对一的。数据报途径的每一个路由器都要将这个分组仅从一个接口转发出去。在单播通信中&#xff0c;路由器仅从它的一个接口转发收到的分组 多播&#xff1a;在多…

域名能生成多少二级域名_15个最佳域名生成器,可帮助您选择域名(FAST)

域名能生成多少二级域名 Are you looking to start a website, but not sure which domain name to use? Picking the right domain name isn’t easy. Specially when you come up with something unique, memorable, and meaningful only to find out that it’s already ta…

Java开发——Mybatis进阶

1. 简介 在掌握了Mybatis的基本使用方式之后&#xff0c;我们需要掌握Mybatis相关的&#xff1a; 参数性质调优方式日志动态sql编写   同样的&#xff0c;官方文档仍然是最具备参考价值的。其可配置的内容如下&#xff0c;常用的属性已标出。 注意&#xff1a;所有的配置的标…

Andriod Recovery模式及ClockworkMod Recovery简介

首先Recovery翻译过来的意思是&#xff1a;复苏、复原。 一、下面解释Recovery的意思 其实Android手机上的Recovery软件就是相当于windows系统电脑上的WinPE和一键还原以及Ghost等软件的功能&#xff0c;Android系统你可以理解为windows XP。Android手机系统和电脑系统一样&…

android的开机动画,设置安卓开机动画、开机logo

我们要修改的是system>media文件夹下的bootanimation.zip(手机开机动画)这个文件 先来讲讲这个文件结构:该zip解压后得到两个文件, 第一个目录存放了开机时播放的图片(图为佳域G3原厂的动绘图片包),见下图: 图片编号001,002,.......010这些是用来控制图片播放顺序的 。…

frft雷达信号处理 论文

三角函数展开起源于18世纪。1808年&#xff0c;傅里叶在他著名的热力学论文集“热的分析理论”中详细的研究了三角级数&#xff0c;并用三角级数成功的解决了许多热传导问题的偏微分方程。由于当时傅里叶的结论并无确凿证据及数学家对傅里叶的观点还很陌生&#xff0c;所以傅里…

阈值分割法——最佳阈值的选择问题

阈值分割法可以说是图像分割中的经典方法&#xff0c;它利用图像中要提取的目标与背景在灰度上的差异&#xff0c;通过设置阈值来把像素级分成若干类&#xff0c;从而实现目标与背景的分离。 一般流程&#xff1a;通过判断图像中每一个像素点的特征属性是否满足阈值的要求&…