OpenCV二值化处理

news/2025/2/21 9:53:08

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

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

1.2. 二值化操作的原理

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

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

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

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

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

1.3.1. 全局阈值法

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

python">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复制

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:二值化后的图像。
python"># 读取图像并转换为灰度图像
img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 使用 Otsu 方法自动计算阈值
ret, binary_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
python"># 自适应阈值二值化
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. 例子

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

python">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减少和增大分别会发生什么

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

 

 


http://www.niftyadmin.cn/n/5860645.html

相关文章

lab4 CSAPP:Cachelab

写在前面 最简单的一集 实验室分为两个部分。在A部分中,实现一个缓存模拟器。在B部分中,编写一个矩阵针对高速缓存性能优化的转置功能。 感觉是比较经典的问题,之前在体系结构的课程中接触过,终于能通过lab实操一下了。 实验目…

tomcat中如何配置,可以支持域名访问

tomcat中如何配置,可以支持域名访问 在Tomcat中配置以支持域名访问,主要涉及到两个方面:配置Tomcat的server.xml文件和在Tomcat的conf目录下的Catalina目录中为每个域名或上下文配置context.xml文件。下面将详细介绍如何进行这些配置。 修改server.xml…

基于契约理论的竞争性组织数据共享安全激励机制matlab模拟与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 参考论文《A Secure Incentive Mechanism for Competitive Organization Data Sharing: A Contract Theoretic Approach》。信息技术发展使数据驱动的智能服务兴起…

【MySQL】索引和视图

索引 索引定义 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一个字段可以添加一个索引,多个字段联合起来也可以添加索引。MySQL查询主要为两种方式:索引检索和全表扫描。如果条件中包含某个字段,而该字段…

android调用ffmpeg解析rtsp协议的视频流

文章目录 一、背景二、解析rtsp数据1、C层功能代码2、jni层的定义3、app层的调用 三、源码下载 一、背景 本demo主要介绍android调用ffmpeg中的接口解析rtsp协议的视频流(不解析音频),得到yuv数据,把yuv转bitmap在android设备上显…

DeepSeek智能测试助手:分类+推理+导出一站式工具

前言 测试开发工程师在日常工作中需要处理大量测试文档,并且这些文档需要被高效分类、清洗和管理,同时结合强大的 AI 推理能力(如 DeepSeek 模型)进行智能化处理和分析。为此,我们开发了一款基于 PyQt5 的 GUI 工具&a…

钉钉多维表:数据管理与协作的新篇章

在当今数字化时代,数据的高效管理和团队协作已成为企业竞争力的关键因素之一。钉钉多维表,作为一款基于钉钉平台的数据协作管理工具,正以其独特的功能和优势,引领着数据管理与协作的新潮流。本文将为您全面解析钉钉多维表的定义、特点、功能亮点、应用场景以及如何使用,让您轻松…

跨站点请求伪造(CSRF)类漏洞攻击方式与防御措施|软件安全测试技术系列

本系列文章分享JavaScript语言常见的安全漏洞,漏洞的原理,可能导致的安全问题,以及如何防御与避免。本文分享的是跨站点请求伪造(Cross Sites Request Forgery)。 跨站点请求伪造,指利用用户身份操作用户账…