009 OpenCV 二值化 threshold

一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、二值化算法

2.1、概述

在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数据量,从而突显出目标的轮廓。

具体来说,函数threshold可以将图像上的像素根据阈值划分为两类:大于或等于阈值的像素值被赋为最大值(或最大灰度值),而小于阈值的像素值则被赋为最小值(或最小灰度值)。这样的操作对于后续的特征提取和图像分析极为重要。例如,我们可以通过设定不同的阈值来对图像进行不同程度的二值化处理,以适应不同的应用场景。

然而,虽然threshold函数在机器视觉应用中有着广泛的应用,但其也存在一些缺点。例如,它只能处理单通道的图像,即灰度图像,而不能直接处理彩色图像。此外,选择合适的阈值也是一项挑战,因为如果阈值选择不当,可能会导致图像信息的丢失或者噪声的增加。

总的来说,OpenCV中的二值化函数threshold在机器视觉应用中扮演着重要角色,能够有效地简化图像数据并突出目标特征。但同时我们也需要注意其存在的一些局限性,如仅支持灰度图像以及阈值选择的困难等。

2.2、函数API

OpenCV中的二值化函数threshold是一种将图像转换为二值图像的方法。它通过设置一个阈值,将图像中的像素值分为两类:大于阈值的像素值为255(白色),小于等于阈值的像素值为0(黑色)。这种方法常用于图像处理和计算机视觉任务中,如边缘检测、轮廓识别等。

函数原型:

cv2.threshold(src, thresh, maxval, type)

参数说明:

  • src:输入图像,通常为灰度图像。
  • thresh:阈值,用于将像素值分为两类。
  • maxval:最大值,当像素值大于阈值时,将其设置为此值。
  • type:阈值类型,有以下几种选择:
    • cv::THRESH_BINARY:二值化,大于阈值的像素值为255,小于等于阈值的像素值为0。
    • cv::THRESH_BINARY_INV:反向二值化,大于阈值的像素值为0,小于等于阈值的像素值为255。
    • cv::THRESH_TRUNC:截断,大于阈值的像素值保持不变,小于等于阈值的像素值设置为阈值。
    • cv::THRESH_TOZERO:零化,大于阈值的像素值保持不变,小于等于阈值的像素值设置为0。
    • cv::THRESH_TOZERO_INV:反向零化,大于阈值的像素值设置为0,小于等于阈值的像素值保持不变。

三、代码演示

代码演示5种二值算法效果,5中算法的区别这里再贴一次:

  • cv::THRESH_BINARY:二值化,大于阈值的像素值为255,小于等于阈值的像素值为0。
  • cv::THRESH_BINARY_INV:反向二值化,大于阈值的像素值为0,小于等于阈值的像素值为255。
  • cv::THRESH_TRUNC:截断,大于阈值的像素值保持不变,小于等于阈值的像素值设置为阈值。
  • cv::THRESH_TOZERO:零化,大于阈值的像素值保持不变,小于等于阈值的像素值设置为0。
  • cv::THRESH_TOZERO_INV:反向零化,大于阈值的像素值设置为0,小于等于阈值的像素值保持不变。
from __future__ import print_function
import cv2 as cv
import argparsemax_value = 255
max_type = 4
max_binary_value = 255
# 这里有5种二值化算法,在gui界面使用滑条选择
trackbar_type = 'Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted'
trackbar_value = 'Value'
window_name = 'Threshold Demo'
# 二值化
def Threshold_Demo(val):#0: Binary#1: Binary Inverted#2: Threshold Truncated#3: Threshold to Zero#4: Threshold to Zero Invertedthreshold_type = cv.getTrackbarPos(trackbar_type, window_name)threshold_value = cv.getTrackbarPos(trackbar_value, window_name)_, dst = cv.threshold(src_gray, threshold_value, max_binary_value, threshold_type )cv.imshow(window_name, dst)
parser = argparse.ArgumentParser(description='Code for Basic Thresholding Operations tutorial.')
parser.add_argument('--input', help='Path to input image.', default='data/stuff.jpg') # 读取图片
args = parser.parse_args()
src = cv.imread(cv.samples.findFile(args.input))
if src is None:print('Could not open or find the image: ', args.input)exit(0)
# 彩色图转灰度图
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.namedWindow(window_name)
# 创建滑条
cv.createTrackbar(trackbar_type, window_name , 3, max_type, Threshold_Demo)
cv.createTrackbar(trackbar_value, window_name , 0, max_value, Threshold_Demo)
Threshold_Demo(0)
cv.waitKey()

    #0: Binary

    #1: Binary Inverted 

  #2: Threshold Truncated 

  #3: Threshold to Zero

    #4: Threshold to Zero Inverted

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

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

相关文章

ASP.NET Core 启用CORS

浏览器的安全阻止一个域的本地页面请求另外不同域的本地页面,这个限制叫同源策略,这个安全特性用来阻止恶意站点从别的网站读取数据 例如假如我有一个页面叫A.html https://foo.example/A.html 现在页面A.html有一个ajax代码尝试读取B.html的HTML的源…

【PyQt】(自定义类)阴影遮罩

写了一个感觉有些用的小玩具。 用于给控件添加阴影遮罩(强调主控件的同时屏蔽其余控件的点击) 自定义阴影遮罩Mask: from PyQt5.QtCore import QPoint,QRect,Qt,QPoint,QSize from PyQt5.QtWidgets import QWidget,QLabel,QPushButton,QVBoxLayout from PyQt5.QtGu…

leetcode:合并两个有序链表

题目描述 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) 题目分析 这个算法思路很简单:就是直接找小尾插 定义一个tail和head,对比两个链表结点的val,小的尾插到tail->next,如果一个链表…

每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树

每日一题系列(day 01) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

企业微信身份验证

本篇主要是在上一篇获取第三方凭证基础上,用户通过三方网站自定义授权登录后获取用户信息,以实现用户绑定登录功能。 构造第三方应用授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息, 第一步需要构造如下的链接来获取授权c…

马养殖场建设VR模拟实训教学平台具有灵活性和复用性

为保障养殖场生物安全,避免疫病传播,学生出入养殖场受时间和地域的限制, 生产实习多以参观为主,通过畜牧企业技术人员的讲解,学生被动了解生产过程。为了解决畜牧养殖实训难的问题,借助VR技术开展畜牧养殖虚…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂,为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况,本文以航次1个钻孔(U1403)为例,更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图,从图中的颜色效果可以看出,此多波束的成…

归并排序算法

文章目录 归并排序一、归并排序思路二、归并排序算法模板三、题目代码 归并排序 一、归并排序思路 二、归并排序算法模板 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;//中间值merge_sort(q, l, mid);merge_sort(q, mid 1, r);…

大数据分析与应用实验任务九

大数据分析与应用实验任务九 实验目的 进一步熟悉pyspark程序运行方式; 熟练掌握pysaprkRDD基本操作相关的方法、函数,解决基本问题。 实验任务 进入pyspark实验环境,打开命令行窗口,输入pyspark,完成下列任务&am…

Redis入门教程

1. 什么是NoSql NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

onnx导出报错 | IndexError: index_select(): Index is supposed to be a vector

解决方案: 在torch.onnx.export钟添加do_constant_foldingFalse,如下 torch.onnx.export(model,(None, text),text_fp32_onnx_path,input_names[text],output_names[unnorm_text_features],export_paramsTrue,opset_version13,verboseTrue,do_constant_…

编程参考 - C++ Code Review: 一个计算器的项目

GitHub - jroelofs/calc: Toy Calculator Toy Calculator 1,拿到一个project,第一眼看,没有配置文件,说明没有引入持续集成系统,continuous integration system。 2,然后看cmake文件,使用的子…

使用Python的turtle模块绘制钢铁侠图案

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。在本博客中,我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令,我们可以引导turtle绘制出指定的图…

第十四章 控制值的转换 - 在DISPLAYLIST中投影值

文章目录 第十四章 控制值的转换 - 在DISPLAYLIST中投影值在DISPLAYLIST中投影值 第十四章 控制值的转换 - 在DISPLAYLIST中投影值 在DISPLAYLIST中投影值 对于 %String 类型(或任何子类)的属性,XML 投影可以使用 DISPLAYLIST 参数。 简单…

CrystalDiskInfo/CrystalDiskMark/DiskGenius系统迁移

CrystalDiskInfo 主要用于看硬盘的各种信息,包括但不限于硬盘通电时间、通电次数、硬盘好坏状态 CrystalDiskMark 主要用于测试硬盘的读写速度、连续读写速度 DiskGenius 主要用于通过U盘装操作系统后进行,磁盘分区,更改磁盘名、隐藏部分…

【前端知识】Node——http模块url模块的常用操作

一、创建简易Server const http require(http); const URL require(url);const HTTP_PORT 8088;const server http.createServer((req, res) > {// req:request请求对象,包含请求相关的信息;// res:response响应对象&…

【MISRA C 2012】Rule 5.2 在同一作用域和名称空间中声明的标识符应该是不同的

1. 规则1.1 原文1.2 分类 2. 关键描述3. 代码实例 1. 规则 1.1 原文 Rule 5.2 Identifiers declared in the same scope and name space shall be distinct Category Required Analysis Decidable, Single Translation Unit Applies to C90, C99 1.2 分类 规则4.2&#xff…

案例014:Java+SSM+uniapp+mysql基于微信小程序的健身管理系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…