opencv实现阈值分割

2023-11-14

基础函数

在此列出,后面将直接使用,不再赘述

  1. 导入库
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
  1. 展示函数
def show(img):
	if img.ndim == 2:
		plt.imshow(img, cmap='gray', vmin=0, vmax=255)
	else:
		img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
		plt.imshow(img)
	plt.show()

直方图阈值

算法描述:根据图像灰度直方图,人工寻找阈值
算法特点:适用双峰图像
在这里插入图片描述

实现

导入图片

img = cv.imread('pic/eagle.jpg', 0)
show(img) 

在这里插入图片描述
画出直方图

plt.hist(img.ravel(), 256, [0, 256])
plt.show()

在这里插入图片描述

plt.hist(img.flatten(), np.arange(-0.5, 256, 1), color='g')
plt.show()

在这里插入图片描述
二值化

_, img_bin = cv.threshold(img, 125, 255, cv.THRESH_BINARY)
show(img_bin)

在这里插入图片描述

threshold 函数使用

在这里插入图片描述

三角法阈值

论文:AUTOMATIC MEASUREMENT OF SISTER CHROMATID EXCHANGE FREQUENCY

算法思想:几何法,适用单峰图像

在这里插入图片描述
距离最远的点,即为分割点

实现

img = cv.imread('pic/blossom', 0)
show(img)

在这里插入图片描述

plt.hist(img.flattern(), np.arange(-0.5, 256, 1), color='g')
plt.show()

在这里插入图片描述

th, img_ = cv.threshold(img, 0, 255, cv.THRESH_TRIANGLE)
print(th)
show(np.hstack([img, img_bin])

在这里插入图片描述

三角法自动寻找阈值,第二个参数随便写就行

迭代法阈值

算法步骤

  1. 选取初始分割阈值,通常可选图像灰度平均值 T T T
  2. 根据阈值 T T T将图像像素分割为背景和前景,分别求出两者的平均灰度 T 0 和 T 1 T_0和T_1 T0T1
  3. 计算新的阈值 T ′ = T 0 + T 1 2 T'={T_0+T_1 \over 2} T=2T0+T1
  4. T = = T ′ T==T' T==T,则迭代结束, T T T即为最终阈值。否则令 T = T ′ T=T' T=T,转第(2)步。

前景为 > T >T >T的部分,背景为 < T <T <T的部分

在这里插入图片描述

Python语法补充

a = np.random.randint(0, 10, (4, 4))

在这里插入图片描述

a[a <= 5]

在这里插入图片描述

a[a <= 5].mean()

在这里插入图片描述

实现

img = cv.imread('pic/eagle', 0)

T = img.mean()

while True:
	t0 = img[img < T].mean()	// 背景平均灰度值
	t1 = img[img >= T].mean()	// 前景平均灰度值
	t = (t0 + t1) / 2

	print(T, t)
	if T == t:	// 可适当放宽条件, abs(T-t) < 1
		break
	T = t
T = int(T)	// 浮点数没有用

print(f"Best Threshold = {T}")

Best Threshold = 120

大津法

理论

算法思想:最大类间方差
对于给定阈值 T T T,可以将图像分为目标和背景。其中背景点数占图像比例为 p 0 p_0 p0,平均灰度值为 m 0 m_0 m0。而且标定数占图像比例为 p 1 p_1 p1,平均灰度值为 m 1 m_1 m1,其中满足
p 0 + p 1 = 1 p_0+p_1=1 p0+p1=1
整幅图像的平均灰度值为常数,跟阈值无关,且为
m ˉ = p 0 m 0 + p 1 m 1 \bar m = p_0m_0+p_1m_1 mˉ=p0m0+p1m1
类间方差为
σ 2 = p 0 ( m 0 − m ˉ ) 2 + p 1 ( m 1 − m ˉ ) 2 \sigma^2=p_0(m_0-\bar m)^2+p_1(m_1-\bar m)^2 σ2=p0(m0mˉ)2+p1(m1mˉ)2
代入 p 0 + p 1 = 1 和 m ˉ p_0+p_1=1和\bar m p0+p1=1mˉ可简化为
σ 2 = p 0 p 1 ( m 0 − m 1 ) 2 \sigma^2=p_0p_1(m_0-m_1)^2 σ2=p0p1(m0m1)2
遍历灰度值,找出能使 σ 2 \sigma^2 σ2最大的值

在这里插入图片描述

cv实现

img = cv.imread('pic/eagle.jpg', 0)

th, img_bin = cv.threshod(img, -1, 255, cv.THRESH_OTSU)
print(th)
show(img_bin)

在这里插入图片描述

底层复现

img = cv.imread('pic/eagle', 0)

Sigma = -1
T = 0

for t in range(0, 256):
	bg = img[img <= t]
	obj = img[img > t]
	
	p0 = bg.size / img.size
	p1 = obj.size / img.size

	m0 = 0 if obj.size==0 else bg.mean()
	m1 =  0 if obj.size==0 else obj.mean()

	sigma = p0*p1*(m0-m1)**2

	if sigma > Sigma:
		Sigma = sigma
		T = t

自适应阈值

理论

算法思想:局部二值化

全局二值化容易受阴影影响,所以可以局部二值化。自适应阈值分割的本质就是局部二值化。

具体操作步骤

  1. 对某个像素值,原来为 S S S,取其周围的 n × n n \times n n×n的区域,求区域均值或高斯加权值,记为T;
  2. 对8位图像,如果 S > T S>T S>T,则该像素点二值化为255,否则为0.

优化

  1. 在实际操作中,通过卷积操作,即均值模糊或高斯模糊,实现求区域均值或高斯加权值;
  2. 上面步骤中,增加超参数 C C C C C C可以为任何实数,当 S > T − C S>T-C S>TC时,把原像素二值化为255.
  3. 也可以设置超参数 α ∈ [ 0 , 1 ] \alpha \in [0,1] α[0,1],当 S > ( 1 − α ) T S>(1-\alpha)T S>(1α)T时把原像素点二值化为255,通常取 α = 0.15 \alpha=0.15 α=0.15

注:邻域大小一般要大于目标大小,但也不能太大,否则效果不好。

CV实现

img = cv.imread('pic/page', 0)
show(img)

在这里插入图片描述

img_bin = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 21, 6)
show(img_bin)

6 就是上面的C,21就是核大小
在这里插入图片描述

底层复现

一. 通过超参数C实现

img = cv.imrad('pic/page', 0)

C = 0
winSize = 21	// 和一个字体差不多大

img_blur = cv.blur(img, (winSize, winSize))
show(img > img_blur)

在这里插入图片描述

C = 6

img_bin = np.uint8(img>img_blur.astype(np.int) - C) * 255

show(img_bin)

在这里插入图片描述
二. 通过超参数 α \alpha α实现

img = cv.imread('pic/page.jpg', 0)

alpha = 0.15
winSize = 21

img_blur = cv.GaussianBlur(img, (winSize, winSize), 5)
img_bin = np.uint8(img > (1-alpha) * img_blur) * 255 

show(img_bin)

对于参数不是很敏感
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv实现阈值分割 的相关文章

随机推荐

  • 极验java源码_jsp滑动拼图极验验证java代码

    运行环境 Myeclipse tomcat6 jdk1 7 最近研究了一个新的验证登录注册的代码 叫做极验验证滑动拼图代码 对它感兴趣是因为在b站看到了 觉得对页面的显示效果特别好 而且也很安全 它是属于行为式验证 简单一滑即可完成拼图 用
  • 计算机网络 第1章 概述 知识小结

    1 电路交换 报文交换和分组交换的主要优缺点 电路交换 优点 通信双方时延小 缺点 网络传输易堵塞 浪费资源且效率低 报文交换 优点 网络信道利用率较高 缺点 延时长 对转发中心要求高 需占用较大存储空间 分组交换 优点 高效 逐段占用 灵
  • ICLR 2023

    PaperWeekly 原创 作者 黄融杰 单位 浙江大学 研究方向 语音翻译 语音到语音翻译 S2ST 对于打破语言壁垒与沟通障碍非常有益 传统的 S2ST 系统通常由语音识别 ASR 机器翻译 MT 和语音合成 TTS 三部分组成 与这
  • NewBing、Andi、Phind、Perplexity 还有国产kuaisou五个AI搜索引擎的介绍和对比

    NewBing NewBing是微软推出的新一代AI搜索引擎 它基于OpenAI的下一代大语言模型 比ChatGPT更强大 专门为搜索定制 NewBing可以理解自然语言的问题 生成简洁 准确 有趣的回答 并提供相关的链接和图片 NewBi
  • docker 启动mysql5.7_在Docker上面安装/启动、运行、挂载MySQL5.7

    下载文档请看 https hub docker com r MysqL MysqL server 一 下载镜像 执行命令 docker pull MysqL MysqL server 5 7 查看命令 docker images 运行Mys
  • 【Java虚拟机】第三章、jvm运行期优化,解释器,编译器(AOT静态编译,JIT动态编译)

    已经第三章了 看了前两章是不是有点懵 或者开始意识到了什么 或者整个串联起来了 回顾一下 第一张主要讲的是jvm怎么创建 第二章讲的是jvm内存结构 和番外篇class加载过程 那么我们再结合这一章解释器和编译器 静态和动态编译 把他们串到
  • 零基础小白入门Python,值得看的几本书籍

    Python目前是全球4大流行编程语言之一 根据今年TIOBE最新排名 Python已超越C 与Java C C 一起成为全球前4大最流行语言 指数变化一直呈现出上升的趋势 TIOBE最新排名 众所周知 Python应用广泛 涵盖后端开发
  • 创业因何维艰,细数可能会死的几个关键节点

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 云视链等几个创业团队被扒皮之后 创业者的品行问题开始被摆到了桌面上来讨论 整个社会开始了一场 创业者 的反思潮 而 霸道总裁 余佳文不合适宜的言论再一次将这股浪潮推向了巅峰
  • 获取磁盘信息函数statvfs()

    对应的头文件 include
  • 【ES】Elasticsearch 简介

    大数据开发经常用到 Elasticesearch 今天做一下介绍 1 Elasticsearch 简介 Elaticsearch 简称为 ES 是一个开源的高扩展的分布式全文检索引擎 特点 近乎实时的存储 检索数据 扩展性好 可以扩展到上百
  • 元组的详细操作

    一 创建元组 name chinese gansu beijing 创建空元组 name 元组中只包含一个元素时 需要在元素后面添加逗号消除歧义 name chinese 二 访问元组 元组可以使用下标索引来访问元组中的值 name chi
  • RK356x Android11更换默认的Launcher

    1 开发环境 ubuntu版本 18 04 开发平台 RK356x Android版本 android11 2 目的 android11 系统自带了一个启动器Launcher3 在android源码路径下的packages apps Lau
  • 机器学习之深度神经网络

    目录 卷积神经网络与全连接神经网络 前向后向传播推导 通用手写体识别模型 人脸识别模型 电影评论情感分析模型 卷积神经网络与全连接神经网络 卷积神经网络 Convolutional Neural Network CNN 和全连接神经网络 F
  • 数据结构——普里姆(Prim)算法

    普里姆算法 Prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 意即由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 且其所有边的权值之和亦为最小 以下是数据结构中关于普里姆算法的操作 编程风格参考严蔚敏版数据结
  • 实施运维企业面试题-5

    NETWORK 1 请描述 TCP IP 协议中主机与主机之间通信的三要素 参考答案 IP 地址 IP address 子网掩码 subnet mask IP 路由 IP router 2 请描述 IP 地址的分类及每一类的范围 参考答案
  • Graphormer复现碎碎念

    一 简介 Graphormer https github com microsoft Graphormerhttps github com microsoft Graphormer 二 安装 使用 install sh安装 前面是pip直接
  • localStorage的过期时间设置的方法?——和派孔明

    我们都知道localStorage不主动删除 永远不会销毁 那么如何设置localStorage的过期时间呢 今天我们来一起尝试一下
  • C++与STL基础二:栈stack与前中后缀表达式的应用

    C 与STL基础二 栈stack与前中后缀表达式的应用 栈 stack 是一种具有特定操作规则的数据结构 它遵循后进先出 LIFO 的原则 在C 中 我们可以使用STL 标准模板库 中的stack类来实现栈的功能 本文将介绍栈及其常见应用之
  • Python之numpy教程(二):运算、索引、切片

    1 numpy数组的特点在于 大小相等的数组之间 任何算数运算都会将运算应用到元素级 请看下面的例子 arr np array 1 2 3 4 5 6 arr输出 array 1 2 3 4 5 6 arr arr输出 array 1 4
  • opencv实现阈值分割

    文章目录 基础函数 直方图阈值 实现 threshold 函数使用 三角法阈值 实现 迭代法阈值 算法步骤 Python语法补充 实现 大津法 理论 cv实现 底层复现 自适应阈值 理论 具体操作步骤 优化 CV实现 底层复现 基础函数 在