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) #减少阈值

 

 

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

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

相关文章

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中,快速交付强大的应用程序至关重要。尽管如此,在不影响质量的情况下保持速度可能是一项艰巨的任务,这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 (SDLC) 的透明视图…

由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)

最近,随着DeepSeek的爆火,GRPO也走进了视野中。为了更好的学习GRPO,需要对PPO的强化学习有一个深入的理解,那么写一篇文章加深理解吧。纵观网上的文章,要么说PPO原理,各种复杂的公式看了就晕,要…

【Java八股文】08-计算机网络面试篇

【Java八股文】08-计算机网络面试篇 计算机网络面试篇网络模型网络OSI模型和TCP/IP模型分别介绍一下键入网址到网页显示,期间发生了什么? 应用层- HTTP应用层有哪些协议?HTTP是什么及HTTP报文有哪些部分?HTTP是怎么传输数据的HTTP…

【Linux】Linux 文件系统——有关 inode 不足的案例

ℹ️大家好,我是练小杰,今天周二了,明天星期三,还有三天就是星期五了,坚持住啊各位!!!😆 本文是对之前Linux文件权限中的inode号进行实例讨论,看到博客有错误…

SpringBoot整合Redis和Redision锁

参考文章 1.Redis 1.导入依赖 <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.c…

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者&#xff1a;程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案&#xff0c;但是很多人表示还是用的不够爽&#xff0c;比如用CodeChat的方案&#xff0c;只支持V3版本&#xff0c;不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么&#xff0c;今天&#xff0c;给…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…

PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在使用 PyTorch 进行深度学习模型训练与调优过程中&#xff0c;torch.cuda.empty_cache() 方法作为一种高效工具被广泛采用&#xff1b;但其正确应用要求充分理解该方法的功能及最佳实践。下文将对该方…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

配置Api自动生成

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API&#xff0c;并导入Postman&#xff0c;完成API单元测试 Swagger: 是一套API定义的规范&#xff0c;按照这套规范的要求去定义接口及接口相关信息&#xff0c;再通过可…

【JMeter使用-2】JMeter中Java Request采样器的使用指南

Apache JMeter 是一款功能强大的性能测试工具&#xff0c;支持多种协议和测试场景。除了内置的采样器&#xff08;如HTTP请求、FTP请求等&#xff09;&#xff0c;JMeter还允许通过 Java Request采样器 调用自定义的Java代码&#xff0c;从而实现更复杂的测试逻辑。本文将详细介…

将Google文档导入WordPress:简单实用的几种方法

Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作&#xff0c;并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时&#xff0c;可能会遇到一些小麻烦&#xff0c;比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…

Android开发-深入解析Android中的AIDL及其应用场景

深入解析 Android 中的 AIDL 及其应用场景 1. 前言2. AIDL 的核心概念3. AIDL 的实现步骤3.1. 定义 AIDL 接口文件3.2. 实现服务端&#xff08;Service&#xff09;3.3. 客户端绑定与调用 4. AIDL 的典型应用场景4.1. 多进程应用4.2. 与系统服务交互4.3. 高性能 IPC4.4. 跨应用…

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例 目录 PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例学前思考&#xff1a;一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1?安装nginx的依赖插件 3.2 下载nginx ?3.3?创建一个目录作为nginx的安装路径 ?3.4?解压 ?3.5?进入解压后的目录 3.6?指定nginx的安装路径 ?3.7?编译和安装nginx 3.8 启动nginx ?…

STM32 HAL库标准库+ESP8266+机智云

前言 最近在项目中需要云平台对接&#xff0c;前面使用的是阿里云物理平台&#xff0c;具体开发可以看看我的这个文章&#xff1a;手把手教会使用阿里云平台&#xff0c;不过好像没有可以在手机很方便打开连接的&#xff0c;所以我在网上找到一些资料&#xff0c;发现机智云是…

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…

DarkLabel 2.4使用指南:高效标注视频数据目标检测标签

工具概述 DarkLabel 2.4 是一款强大的多功能标注工具&#xff0c;专为计算机视觉开发者设计&#xff0c;旨在提升标注工作的效率和精确度。其智能标注引擎支持两项核心功能&#xff1a;线性插值标注与多目标跟踪&#xff0c;极大地优化了视频标注过程。 &#xff08;1&#x…