OpenCV:二值化与自适应阈值

目录

简述

1. 什么是二值化

2. 二值化接口

2.1 参数说明​​​​​

2.2 示例代码

2.3 运行结果

3. 自适应阈值

3.1 参数说明

3.2 示例代码

3.3 运行结果

4. 总结

4.1 二值化

4.2 自适应阈值


相关阅读

OpenCV:图像的腐蚀与膨胀-CSDN博客


简述

图像二值化是图像处理中的基础操作,它将图像中的像素分为两类:前景和背景。二值化在很多图像分析任务中非常重要,如目标检测、形态学操作等。自适应阈值作为一种常用的阈值选择方法,可以根据图像局部的特性动态调整阈值,尤其适用于照明不均匀或噪声较多的图像。本文将详细介绍 OpenCV 中的二值化、自适应阈值以及相关接口的使用。


1. 什么是二值化

二值化是图像处理中一种简单的图像分割方法,其目标是将灰度图像转换成黑白图像。具体来说,它通过一个阈值将每个像素的灰度值与该阈值进行比较,如果像素值大于该阈值,则将其置为最大值(通常是 255);如果小于阈值,则将其置为最小值(通常是 0)。这样,图像就只有两种颜色:黑色和白色。

二值化的基本步骤:

  1. 将图像转换为灰度图像。
  2. 设置一个全局阈值,通常范围为 0 到 255。
  3. 根据阈值将图像分为两类:高于阈值的像素设置为白色(255),低于阈值的像素设置为黑色(0)。

2. 二值化接口

在 OpenCV 中,cv2.threshold 是实现二值化的函数。其基本语法如下:

retval, dst = cv2.threshold(src, thresh, maxval, type)

2.1 参数说明​​​​​

  • src: 输入图像,必须是灰度图像。
  • thresh: 阈值,用于图像分割。
  • maxval: 高于阈值的像素值设置为 maxval。
  • type: 阈值类型,控制如何应用阈值,有多个选项:
cv2.THRESH_BINARY简单二值化,像素值大于阈值时为最大值,小于阈值时为 0。
cv2.THRESH_BINARY_INV与 cv2.THRESH_BINARY 相反。
cv2.THRESH_TRUNC大于阈值的像素被截断为阈值值。
cv2.THRESH_TOZERO大于阈值的像素保持不变,小于阈值的像素置为 0。
cv2.THRESH_TOZERO_INV与 cv2.THRESH_TOZERO 相反。

2.2 示例代码

import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\qt.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 设置阈值和最大值
thresh_value = 127
max_value = 255

# 进行二值化操作
_, binary_image = cv2.threshold(gray_image, thresh_value, max_value, cv2.THRESH_BINARY)

# 显示结果
cv2.imshow('Image', image)
#cv2.imshow('Gray Image', gray_image)
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3 运行结果

说明:

  • 原始图像:灰度图像
  • 二值化结果:基于阈值 127 将图像转换为黑白图像。

3. 自适应阈值

在一些图像中,亮度和对比度可能在不同区域有很大变化,这使得使用全局阈值进行二值化变得不太有效。为了解决这个问题,OpenCV 提供了 自适应阈值 技术,它通过为每个像素选择局部阈值来进行二值化。

自适应阈值的计算方法是根据每个像素周围的邻域像素值来决定该像素的阈值。这对于光照不均匀的图像非常有用。

自适应阈值的基本方法:

  • 局部区域:将图像分为小区域(通常是一个方块或矩形),对每个小区域计算阈值。
  • 方法选择:常用的两种方法是计算局部区域的均值 和 使用高斯加权平均来计算局部区域的阈值。

OpenCV 中的 cv2.adaptiveThreshold 函数

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

3.1 参数说明

  • src: 输入图像,必须是灰度图。
  • maxValue: 输出图像的最大值,通常为 255。
  • adaptiveMethod: 自适应方法,常用的有:
  • cv2.ADAPTIVE_THRESH_MEAN_C: 使用局部区域的均值作为阈值。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 使用局部区域的高斯加权均值作为阈值。
  • thresholdType: 阈值类型,通常为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV。
  • blockSize: 计算阈值时使用的邻域大小,必须是奇数。
  • C: 常数,表示阈值的调整项,用于减去均值或高斯加权均值。

3.2 示例代码

import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('D:\\resource\\qt.jpg')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 设置阈值和最大值
thresh_value = 127
max_value = 255

# 应用自适应阈值
result_adaptive = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                                cv2.THRESH_BINARY, 11, 2)

# 显示结果
cv2.imshow('Image', image)
#cv2.imshow('Gray', gray_image)
cv2.imshow('Adaptive', result_adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 运行结果

说明:

  • 原始图像:灰度图像
  • 自适应阈值结果:基于每个小区域计算阈值,从而解决了全局阈值方法无法处理的光照不均匀问题。

4. 总结

4.1 二值化

  • 使用全局阈值将图像转换为黑白图像,适用于光照均匀或噪声较少的图像。
  • OpenCV 提供的 cv2.threshold 函数能够方便地实现这种操作。

4.2 自适应阈值

  • 对于光照不均匀或噪声较多的图像,自适应阈值方法会动态调整每个像素的阈值,适应不同区域的局部光照。
  • OpenCV 提供的 cv2.adaptiveThreshold 函数能够根据局部区域计算阈值,常用于图像处理和文字识别等任务。

这两种方法在图像处理、图像分割、OCR(光学字符识别)等场景中都有广泛应用。通过调整阈值和自适应方法的参数,可以实现更加精确的二值化效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【memgpt】letta 课程6: 多agent编排

Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块

Java---猜数字游戏

本篇文章所实现的是Java经典的猜数字游戏 , 运用简单代码来实现基本功能 目录 一.题目要求 二.游戏准备 三.代码实现 一.题目要求 随机生成一个1-100之间的整数(可以自己设置区间),提示用户猜测,猜大提示"猜大了",…

STM32标准库移植RT-Thread nano

STM32标准库移植RT-Thread Nano 哔哩哔哩教程链接:STM32F1标准库移植RT_Thread Nano 移植前的准备 stm32标准库的裸机代码(最好带有点灯和串口)RT-Thread Nano Pack自己的开发板 移植前的说明 本人是在读学生,正在学习阶段&a…

使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?

使用Navicat Premium管理数据库时,最糟心的事情莫过于事务默认自动提交,也就是你写完语句运行时,它自动执行commit提交至数据库,此时你就无法进行回滚操作。 建议您尝试取消勾选“选项”中的“自动开始事务”,点击“工…

AutoDL 云服务器:xfce4 远程桌面 终端乱码 + 谷歌浏览器

/usr/bin/google-chrome-stable --no-sandbox --proxy-server"127.0.0.1:7890" 打开新的PowerShell ssh -p 54521 rootconnect.yza1.seetacloud.com /opt/TurboVNC/bin/vncserver -kill :1 rm -rf /tmp/.X1* USERroot /opt/TurboVNC/bin/vncserver :1 -desktop …

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…

JavaScript网页设计案例(任务管理器)

任务管理器 功能描述:用户可以添加任务、删除任务,并且任务列表在页面刷新后不会丢失,还能进行任务过滤与搜索。代码实现思路 HTML 结构:创建输入框用于输入任务、按钮用于添加任务,以及无序列表用于展示任务列表。CSS…

模型I/O功能之模型包装器

文章目录 模型包装器分类LLM模型包装器、聊天模型包装器 截至2023年7月,LangChain支持的大语言模型已经超过了50种,这其中包括了来自OpenAI、Meta、Google等顶尖科技公司的大语言模型,以及各类优秀的开源大语言模型。对于这些大语言模型&…

机器人抓取与操作经典规划算法(深蓝)——2

1 经典规划算法 位姿估计:(1)相机系位姿 (2)机器人系位姿 抓取位姿:(1)抓取位姿计算 (2)抓取评估和优化 路径规划:(1)笛卡…

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统(UnionFS)、命名空间(namespace)、权限管理(cgroup),虚拟出一…

【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)

一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…

Git图形化工具【lazygit】

简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…

单片机基础模块学习——超声波传感器

一、超声波原理 左边发射超声波信号,右边接收超声波信号 左边的芯片用来处理超声波发射信号,中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大,然后输入给超声…

BWM 世界模型

DGX AGX Ominiverse With Cosmos 功能 1w 张 H100 训练了 3个月 使用 Ray 串流 数据 数据准备 处理 pipeline 数组组成 真实世界的物理数据 训练 1、使用 L1 损失,最小化 输入和重构视频之间的像素级差异 以及基于 VGG19 的一个特征感知损失 2、使用光流的损…

【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索

深度与创新:AI领域的革新者 DeepSeek,这个由幻方量化创立的人工智能公司推出的一系列AI模型,不仅在技术架构上展现出了前所未有的突破,更在应用领域中开启了无限可能的大门。从其混合专家架构(MoE)到多头潜…

NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)

用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。…

【Rust自学】17.2. 使用trait对象来存储不同值的类型

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 17.2.1. 需求 这篇文章以一个例子来介绍如何在Rust中使用trait对象来存储不同值的类型。 …

数据分析系列--⑤RapidMiner进行关联分析(中文数据案例)

一、数据集 二、数据预处理 1.读取数据、拆分、重命名 2.数据预处理 三、关联分析 四、结论 一、数据集 点击下载数据集shopping_basket.xlsx ,这个数据集专门使用中文数据来进行分析. 二、数据预处理 1.读取数据、拆分、重命名 2.数据预处理 三、关联分析 四、结论 Ok,E…