opencv-python常用函数解析及参数介绍(四)——图像阈值

news2024/11/15 13:44:37

图像阈值处理

  • 前言
  • 1.改变图像颜色
    • 灰度图
    • HSV图
  • 2.图像阈值
    • 图像中数值对应的效果
    • 函数与参数
    • 阈值处理效果

前言

在很多任务当中,首要的任务就是对图像进行阈值处理,为后续其他操作做准备,本文将介绍5种阈值处理的方法以及参数设置,同时通过合理的分析帮助记忆相关参数

1.改变图像颜色

无论是图像阈值还是图像轮廓,都是在灰度图的情况下才能进行的,所以我们需要将图片转换成灰度图,除了在读取时直接以灰度图的形式读取之外我们还可以通过函数cv2.cvtColor对图像颜色转换,除了传入图像之外还需要设置转换的类型

cv2.COLOR_BGR2GRAYcv2.COLOR_BGR2HSV
将bgr转换成灰度图将bgr转换成HSV

在HSV中:

HSV
色调(主波长)饱和度(纯度/颜色的阴影)强度

假设我们有这样一个名为kl.jpg的图片
在这里插入图片描述

灰度图

img=cv2.imread('kl.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

在这里插入图片描述

HSV图

hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow("hsv", hsv)
cv2.waitKey(0)    
cv2.destroyAllWindows()

在这里插入图片描述
虽然HSV图看起来有些奇怪,但暂时我们不需要深入太多,只需要了解可以这样转换就好了,请放心,本篇文章中只用到了灰度图。

2.图像阈值

尽管很多时候灰度图就已经可以完成画出图像轮廓的工作了,但是对于一些简单的图像来说,进行阈值处理往往能得到更好的效果

图像中数值对应的效果

在正式开始介绍阈值处理之前我们先要搞清楚图像数值对应的效果,在灰度图中我们需要明白的是数的大小与图像黑白的关系
为了表示方便我们首先还是定义一个用于展示图片的函数

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

现在假设我们的图像是0-255(因为cv2读出的图像数据类型是uint8,正好是0-255)
我们先看值全0的情况

cv_show(np.zeros((200, 200)),'zeros')

在这里插入图片描述
然后是255的情况

cv_show(np.ones((200, 200)) * 255,'ones')

在这里插入图片描述
可以看到在灰度图的情况下越接近0越黑,越接近255越白。

函数与参数

我们使用cv2.threshold函数进行阈值处理,使用方式如下:
ret, dst = cv2.threshold(src, thresh, maxval, type)
其中参数:

参数含义
src输入图,只能输入单通道图像,通常来说为灰度图
dst输出图
thresh阈值
maxval当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type二值化操作的类型,包含5种类型

其中type取值:

取值含义
cv2.THRESH_BINARY超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INVTHRESH_BINARY的反转
cv2.THRESH_TRUNC大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INVTHRESH_TOZERO的反转

和前篇的文章一样,我们结合英文简单的记忆一下效果
binary表示二元,所以经过操作后图像只有两个值,由于我们定义了阈值和最大值,所以自然想到超过阈值的设成最大值,没超过的设成0;
binary_inv是binary的反转这个很好理解,就是0变最大,最大变0
trunc可以拆成trun和c可以理解成变成c,其中c表示的就是阈值,可以理解成变成阈值,所以可以理解为大于阈值的变成阈值
tozero可以拆成to和zero,也就是变成0的意思,可以理解成小于阈值的变成0
同样的tozero的反转也很好理解了

阈值处理效果

我们画一下灰度图和五种阈值处理的结果

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['GRAY', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述
下面我们再结合图像分析一下5种阈值处理
binary是高于阈值的设成最大,低于阈值的设成0,那么就是较黑的变成黑色(0值),较白的变成白色(最大值)
binary_inv和binary相反
trunc使得图像更亮,tozero使得图片更暗,而tozero_inv可以看到确实是相反的效果,原本亮的变得很黑,原本黑的变得很亮

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API 概述

API 概述目录概述需求:设计思路实现思路分析1.High-Level API :用于事务边界定义、控制及事务状态查询。2.2. High-Level API5.2.2 GlobalTransactionContextTransactionalTemplateLow-Level API参考资料和推荐阅读Survive by day and develop by night.…

网络协议总结

网络协议总结网络模型网络协议TCP/IP 模型网络接入层封装与解封装实际数据传输举例发送数据包接收数据包网络接口处理IP 模块处理TCP 模块处理应用程序处理网络构成通信介质与数据链路网卡二层交换机路由器 / 三层交换机![在这里插入图片描述](https://img-blog.csdnimg.cn/a8e…

F280049C General-Purpose Input/Out(GPIO)

​ 文章目录GPIO8.1 简介8.2 配置概述8.3 ADC引脚上的数字输入(AIO)8.4 数字通用I/O控制8.5 输入限定8.5.1 异步输入8.5.2 仅与SYSCLKOUT同步8.5.3 使用采样窗口进行鉴定8.6 SPI信号8.7GPIO和外设引脚复用8.7.1GPIO复用8.7.2 外设复用8.8 内部上拉配置要…

基础架构:一条SQL查询语句是如何执行的?

这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表…

DML语句

DML语句目录概述需求:设计思路实现思路分析1.SQL 实例2.UPDATE3.DELETE4.SELECT5.是TRUNCATE参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wai…

数字DNA盗窃可能会在2023年到来

攻击者总是在不断发展并寻找访问数字系统的方法。随着人工智能的使用越来越多,量子计算有望很快成为现实,网络威胁格局的变化比以往任何时候都快。 当谈到网络安全时,我们应该始终尝试着眼于即将发生的事情以及它将产生的影响。我们不能只是…

操作系统实验7:终端设备字符显示的控制

实验目的 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;通过实践掌握Linux 0.11对键盘终端和显示器终端的处理过程。 实验内容 本实验的基本内容是修改Linux 0.11的终端设备处理代码,对键盘输入和字符显示进行非常规…

2022-我的年终总结

去年年末,我也写了一篇年终总结。去年这一年是极度繁忙的一年,因各种原因,过年没回家,一个人在宿舍度过了凄凉的春节。而今年是丰收的一年,去年所付出的一切都在今年获得了回报,我也迎来新的生活。 新的生活…

过年春联不可少,python带你制作春联,体验不一样的过年氛围

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 每逢春节,无论城市还是农村, 家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。 据说这一习俗起于宋代,在明代开始盛…

我是阿豪我的2022年年终总结.

时光如白驹过隙般,飞逝而过,来不及细品岁月的美好。一晃,2022年就过去了! 明天新的一年就来了。回忆一下2022一年都干了什么。 3月份背了大概200多道的前端面试题,疯狂的刷面试题,一天不刷几道面试题心里…

ffmpeg从某站提取视频、音频、详解

ffmpeg从某站提取视频、音频、详解 事件背景 准备链接 第一步安装下载 ffmpeg是开源软件,安装网址http://ffmpeg.org/download.html#build-windows 本人用的windows10系统 打开网址后随便你怎么下载都行,Git、或者直接下等等 按图片输入上述网址也…

【攻防世界】Web very_easy_sql

做了web才发现,原来自己是真的什么都不懂啊,不过也好,说明我有很大的进步空间呢 不闲聊了,来看题目 打开是一个登录界面,我们抓包看看返回些什么 返回包有三个需要注意的地方,我都用框框圈起来了 有一个S…

【C++】map 与 set 的介绍与使用、力扣:692. 前K个高频单词

目录 一、关联式容器 二、键值对 三、set 3.1 set 的介绍 3.2 set 的使用 3.3. set 的使用举例 四、map 4.1 map的介绍 3.2 map 的使用 4.3 map的使用举例 五、经典练习题 1.set的使用 2.map的使用 思路一(稳定排序): 思路二(priority_queue)&#x…

jvm参数说明

-Xmx3550m:设置JVM最大堆内存为3550M。 -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之…

新式 AIMD 拥塞控制

周三晚上发了一则朋友圈,今天整理一下: ​ AIMD 过程可推导出 TCP 吞吐公式: TaRTTbpT\dfrac{a}{RTT}\dfrac{b}{\sqrt{p}}TRTTa​p​b​ a,b 分别为与 AIMD 参数和过程有关,该公式结论内置公平性。设 MSS 1460&…

【MySQL】九,MySQL逻辑架构剖析

服务器处理客户端请求 Connectors 外部的各种类型的连接客户端。 第一层:连接层 客户端访问 MySQL 服务器前,首先要建立 TCP 连接。 经过三次握手成功建立连接后,MySQL对传输过来的账号密码做身份认证、权限获取。 如果用户名密码错误&am…

【Iava】抽象类和接口

祝早日驱散阴霾 文章目录1. 抽象类1.1 抽象类的概念1.2 抽象类的使用注意事项1.3 抽象类的作用2. 接口2.1 接口的定义2.2 接口的使用规则2.3 创建对象拷贝,实现Cloneable3. 抽象类和接口的区别1. 抽象类 1.1 抽象类的概念 抽象类,顾名思义,这是不是一个具体的类,没有实际的功…

四旋翼无人机学习第17节--封装上传github与gitee

0 前言 经过一段时间的绘制,终于绘制完项目所需的封装。为了更好的管理封装,我准备把封装与焊盘上传到github与gitee,方便之后的管理工作。 1 文件上传gitee 注册这里就不作介绍咯。 1、首先点击新建仓库。 2、设置仓库的名称与项目介绍&…

GO语言初始化数据结构的方法你知道吗?

xdm 我是阿兵云原生 使用 golang 进行编码过程中,你们都是如何初始化数据结构的呢 GO 里面提供了 2 个关键字来进行初始化数据结构 newmake 不过有时候我也会直接使用花括号的方式直接就初始化,例如这样: name : []string{"xiaomot…

电源PCB布局要点

本次已常用的集成电源IC芯片TPS 5430.讲解一下布局要求。 在手册中可以看到官方已给出的详细布局。 这是我们原理图设计的TPS 5430。 通过以上了解到了连接关系以及布局要求。那么我们再看看官方要求是如何硬性要求布局的。 总结: 1.输入电容要靠近Vin 管脚 2.电…