OpenCV二值化处理

1.1. 为什么需要二值化操作

二值化操作将灰度图像转换为黑白图像,即将图像中的像素值分为两类:前景(通常为白色,值为 255)和背景(通常为黑色,值为 0)。二值化的主要目的是简化图像,突出目标物体,便于后续的图像分析和处理,如特征提取、目标检测、图像分割等。

1.2. 二值化操作的原理

二值化操作通过设定一个阈值,将图像中的像素值与该阈值进行比较:

  • 如果像素值大于或等于阈值,则将其设为最大值(通常是 255)。
  • 如果像素值小于阈值,则将其设为最小值(通常是 0)。

OpenCV 中常用的二值化方法包括:

  • 全局阈值法:使用一个固定的阈值对整个图像进行二值化。
  • 自动阈值法(OTSU):适用于双峰直方图的图像,该方法会自动计算一个阈值,使得前景和背景的类间方差最大,从而实现最佳的二值化效果。
  • 自适应阈值法:根据图像的局部区域动态计算阈值,适用于光照不均匀的图像。

1.3. OpenCV 中如何实现二值化操作

1.3.1. 全局阈值法

使用 cv2.threshold() 函数实现全局阈值二值化:

import cv2# 读取图像并转换为灰度图像
img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 全局阈值二值化
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 显示结果
cv2.imshow('Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明

  • src:输入的灰度图像。
  • thresh:阈值。
  • maxval:最大值,通常为 255。
  • type:二值化类型,如 cv2.THRESH_BINARY

1.3.2. Otsu 阈值法

使用 cv2.threshold 函数实现 Otsu 阈值法:

Python复制

ret, binary = cv2.threshold(src, thresh, maxval, type)
  • src:输入的灰度图像。
  • thresh:初始阈值(通常设置为 0,因为 Otsu 方法会自动计算最佳阈值)。
  • maxval:阈值化后的最大值,通常是 255。
  • type:阈值化类型,使用 cv2.THRESH_BINARY + cv2.THRESH_OTSU 表示使用 Otsu 方法。
  • ret:自动计算的阈值。
  • binary:二值化后的图像。
# 读取图像并转换为灰度图像
img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)# 使用 Otsu 方法自动计算阈值
ret, binary_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 自适应阈值二值化
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 显示结果
cv2.imshow('Adaptive Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明

  • src:输入的灰度图像。
  • maxValue:最大值,通常为 255。
  • adaptiveMethod:自适应方法,如 cv2.ADAPTIVE_THRESH_MEAN_C
  • thresholdType:二值化类型,如 cv2.THRESH_BINARY
  • blockSize:局部窗口大小,必须是奇数。
  • C:常数偏移值。

1.4. 使用注意事项

  • 图像预处理:在进行二值化之前,通常需要对图像进行预处理,如去噪、灰度转换等。
  • 阈值选择:阈值的选择对二值化结果影响很大,需要根据图像的灰度分布和处理需求来选择合适的阈值。
  • 自适应阈值:对于光照不均匀的图像,自适应阈值法通常比全局阈值法效果更好。
  • 二值化类型:根据具体需求选择合适的二值化类型,如 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 等。

1.5. 例子

我们用一个物体表面的裂缝为例子实验:

def TestThreshold():# 读取图像并转换为灰度图像image_path = 'Carck.png'  img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)if img is None:raise FileNotFoundError(f"图像文件未找到:{image_path}")# 方法1:全局阈值法# 使用固定阈值进行二值化_, binary_global = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 方法2:OTSU 自动阈值法# 自动计算阈值_, binary_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 方法3:自适应阈值法# 根据局部区域动态计算阈值binary_adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 显示结果plt.figure(figsize=(12, 8))plt.subplot(2, 2, 1)plt.imshow(img, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(2, 2, 2)plt.imshow(binary_global, cmap='gray')plt.title('Global Thresholding')plt.axis('off')plt.subplot(2, 2, 3)plt.imshow(binary_otsu, cmap='gray')plt.title('OTSU Thresholding')plt.axis('off')plt.subplot(2, 2, 4)plt.imshow(binary_adaptive, cmap='gray')plt.title('Adaptive Thresholding')plt.axis('off')plt.tight_layout()plt.show()

可以看到全局阈值发和OTSU自动化阈值法效果还可以,自适应阈值法提取效果没有那么好

可以观察到OTSU检查出来的划痕更完整,大家可以修改全局阈值法的值127减少和增大分别会发生什么

 # 方法1:全局阈值法# 使用固定阈值进行二值化_, binary_global = cv2.threshold(img, 140, 255, cv2.THRESH_BINARY) #增大阈值_, binary_global = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) #减少阈值

 

 

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

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

相关文章

[Android]浏览器下载的apk文件无法识别无法安装问题

在Android电话机上,用浏览器下载apk进行版本更新,出现下载文件没被识别为apk,导致无法安装问题。 原来的下载链接: https://mojsetup.obs.cn-southwest-2.myhuaweicloud.com/callphone-release-1.0.4.apk 修改后的下载链接&…

如何使用SSH连接设备?很简单!

前言 小白发现最近写的文章都与SSH息息相关,于是就有了这一篇文章,免得在后续的文章又不断重复如何SSH连接设备。 有需要的小伙伴自然就会看到这里,也不会影响到其他小伙伴的阅读体验。 至于文章里的广告嘛……就当是小伙伴们给小白的一点…

【自学嵌入式(9)ESP8266网络服务器的使用】

ESP8266网络服务器的使用 ESP8266WiFi 库① WiFiClass② WiFiClient③ WiFiServer④ WiFiUDP ESP8266WiFiMulti 库① WiFiMulti ESP8266WebServer 库① P8266WebServer 网络服务器实例在浏览器中控制ESP8266指示灯将开发板引脚状态显示在网页中 在之前的文章中,曾经…

pytorch3d安装记录

官方安装教程: https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md 通过pip 或conda 可以很容易安装上预编译好的包, 安装过程不会报错, 但是使用的时候就会报各种错误 ,原因是预编译好的包跟自己的环境不一定…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结: 1.提出 两个关键点 (视觉语言模型【模型】 少量工业异常检测【方向】) 2.想要解决的问题 3.针对上述问题,本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…

【PostgreSQL】如何通过调整PostgreSQL配置参数提高数据库性能

如何通过调整PostgreSQL配置参数提高数据库性能 1. 数据库初始性能2. 内存相关参数3. WAL(Write-Ahead Logging)相关参数4. 并行查询相关参数5. 连接相关参数6. 根据情况调整 1. 数据库初始性能 使用pgbench在更新PostgreSQL数据库配置前先测试下数据库…

AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践

前言 自2022年末ChatGPT的问世,大语言模型(LLM)技术引发全球关注。在大模型技术落地的最佳实践中,智能体(Agent)架构显现出巨大潜力,成为业界的普遍共识,各大公司也纷纷启动Agent技…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站,内容通俗易懂,讲解风趣幽默,简直让人欲罢不能。忍不住分享给大家,点击这里立刻跳转,开启你的AI学习之旅吧! 前言 – 人工智能教程https://www.captainbed.cn/l…

ChātGPT赋能的“SolidWorks工具箱”:重塑3D设计效率新标杆

ChātGPT精心打造的“SolidWorks工具箱”正逐步成为3D设计领域中的一颗璀璨新星,其集高效、便捷与创新于一身,为用户带来了前所未有的设计体验。以下是对这一革命性工具箱的深度剖析与美化呈现: 一、核心功能:重塑设计流程&#x…

php处理图片出现内存溢出(Allowed memory size of 134217728 bytes exhausted)

错误: 最近做图片上传功能时发现上传某些图片时报内存溢出错误。如下所示: {"code": 0,"msg": "Allowed memory size of 134217728 bytes exhausted (tried to allocate 24576 bytes)","data": {"code&q…

Spring——SpringSecurity开发经验实战

摘要 本文介绍了一个简单的 Spring Security 实战示例,涵盖基本的身份验证和授权流程。首先介绍了 Spring Security 是一个强大的安全框架,用于在 Spring 应用中实现身份验证、授权以及保护应用免受常见安全攻击。接着详细阐述了项目结构、添加 Spring …

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多,可能是一两页都翻不完。此时,我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑,哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

数据结构绪论

一-数据结构的基本概念 1-数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2-数据元素 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。…

kafka基本知识

什么是 Kafka? Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的一部分。Kafka 主要用于构建实时数据管道和流处理应用程序。它能够高效地处理大量的数据流,广泛应用于日志收集、数…

DeepSeek R1本地+私有云版医疗AI部署开发成功案例技术剖析

1. 引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(AI)在医疗领域的应用正逐渐成为推动医疗行业变革的重要力量。近年来,医疗 AI 取得了显著的进展,从疾病诊断、药物研发到医疗管理等各个环节,AI 技术都展现出了巨大的潜力。它能够处理和分析海量的医疗数据,为…

网络安全-openssl工具

OpenSSl是一个开源项目,包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准,并且拥有比较长的历史,现在几乎所有的服务器软件和很多客户端都在使用openssl,其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…

“三次握手”与“四次挥手”:TCP传输控制协议连接过程

目录 什么是TCP协议 “三次握手”建立连接 “四次挥手”断开连接 “三次握手”和“四次挥手”的反思 总结 什么是TCP协议 想象一下,你和远方的朋友要进行一场电话交流,但这通电话不仅仅是随便聊聊,而是要传递一封重要的信件。为了确保这…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…