OpenCV:二值化与自适应阈值

news/2025/1/31 6:47:39 标签: 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(光学字符识别)等场景中都有广泛应用。通过调整阈值和自适应方法的参数,可以实现更加精确的二值化效果。


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

相关文章

AIGC时代的Vue或React前端开发

在AIGC(人工智能生成内容)时代,Vue开发正经历着深刻的变革。以下是对AIGC时代Vue开发的详细分析: 一、AIGC技术对Vue开发的影响 代码生成与自动化 AIGC技术使得开发者能够借助智能工具快速生成和优化Vue代码。例如,通…

架构技能(六):软件设计(下)

我们知道,软件设计包括软件的整体架构设计和模块的详细设计。 在上一篇文章(见 《架构技能(五):软件设计(上)》)谈了软件的整体架构设计,今天聊一下模块的详细设计。 模…

【Linux】21.基础IO(3)

文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库(.a):程序在编译链接的时候把库的代码链接到可…

unity使用AVpro插件播放视频,打包安卓系统总是失败

已经排除了中文文件名等问题,只要在工程中添加了AVpro插件(目前是2.6.6版本),在windows上一切正常使用,可以打包输出,但是只要打包安卓就是错误 一次偶然的机会在一台苹果笔记本上用相同的方法做了一个含有…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址,在IDEA中查找 这里是getInfo函数的声明,我们要找到这个函数的使用,所以点getInfo() Override public JSONObject getInfo() {JSO…

讯飞智作 AI 配音技术浅析(二):深度学习与神经网络

讯飞智作 AI 配音技术依赖于深度学习与神经网络,特别是 Tacotron、WaveNet 和 Transformer-TTS 模型。这些模型通过复杂的神经网络架构和数学公式,实现了从文本到自然语音的高效转换。 一、Tacotron 模型 Tacotron 是一种端到端的语音合成模型&#xff…

rust如何操作oracle

首先鄙视甲骨文,这么多钱的公司,不做一个rust库,还要社区帮忙。有个开源的rust库,叫oracle,但是并不是甲骨文做的。 我们来看一个从oracle数据库取所有表和视图的示例: // 定义连接字符串let conn_str1 format!(&quo…

论文阅读(八):结构方程模型用于研究数量遗传学中的因果表型网络

1.论文链接:Structural Equation Models for Studying Causal Phenotype Networks in Quantitative Genetics 摘要: 表型性状可能在它们之间发挥因果作用。例如,农业物种的高产可能会增加某些疾病的易感性,相反,疾病的…