图像处理 | 图像二值化

在图像处理领域,图像二值化是一个重要的操作,它将彩色或灰度图像转换为只有两种颜色(通常是黑白)的图像。二值化广泛应用于文字识别、图像分割、边缘检测等领域,尤其在处理简洁和高对比度的图像时非常有效。本文将深入介绍图像二值化的概念、原理、常见算法及应用场景。


1. 什么是图像二值化?

图像二值化是指将彩色或灰度图像转换为二值图像(也称为黑白图像)的过程。二值图像只有两种像素值,一般是0和255,分别代表黑色和白色。

二值化的目标

通过将图像中的像素值转化为两个极端值(通常是0和255),使得图像的特征更加突出,便于进一步的图像处理,比如轮廓提取、对象检测等。

常见应用

  • 字符识别:如OCR(光学字符识别)技术。
  • 目标检测:在图像中分割出目标。
  • 图像分割:根据某些条件将图像划分为前景和背景。

2. 图像二值化的原理

图像的每一个像素都有一定的灰度值(灰度图像)。二值化的目的是根据某个阈值,将图像的像素值分为两类:

  • 前景(目标):图像中的感兴趣部分,通常为白色(255)。
  • 背景:图像中不需要关注的部分,通常为黑色(0)。

在具体实现时,图像的每个像素值与预设的阈值进行比较:

  • 如果像素值大于阈值,则该像素为白色(255)。
  • 如果像素值小于或等于阈值,则该像素为黑色(0)。

这种方法的关键在于如何选择阈值。阈值的选择将直接影响二值化效果的好坏。


3. 二值化算法

3.1 全局阈值法

最简单的一种二值化方法。选择一个固定的阈值,遍历每一个像素,将其灰度值与该阈值进行比较,大于阈值的像素值变为255,其他变为0。

实现步骤:
  1. 读取灰度图像。
  2. 选择一个阈值。
  3. 对图像中的每个像素进行比较,应用二值化规则。
import cv2# 读取图像
image = cv2.imread('example.jpg', 0)# 设置阈值
threshold_value = 127# 应用全局阈值
_, binary_image = cv2.threshold(image, threshold_value, 255, cv2.THRESH_BINARY)# 显示结果
cv2.imshow("Binary Image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明

  • src:输入图像(可以是灰度图像,也可以是单通道图像)。输入图像的类型应为 CV_8U(8-bit unsigned integer),即图像的像素值范围是 [0, 255]。

  • thresh:阈值(标量)。将输入图像中的像素值与此阈值进行比较,以决定哪些像素应该设置为 0,哪些像素应该设置为 maxval(通常为 255)。

  • maxval:最大值。小于阈值的像素将被设置为 0(或其他自定义值),大于阈值的像素将被设置为 maxval(通常为 255)。

  • type:阈值类型,决定如何对像素值进行处理。常见的阈值类型有:

    • cv2.THRESH_BINARY:如果像素值大于阈值,设置为 maxval,否则设置为 0(黑色)。
    • cv2.THRESH_BINARY_INV:如果像素值大于阈值,设置为 0, 否则设置为 maxval(白色反转)。
    • cv2.THRESH_TRUNC:如果像素值大于阈值,将其截断为阈值(即设为 thresh),否则保持原值。
    • cv2.THRESH_TOZERO:如果像素值大于阈值,保持原值,否则设置为 0。
    • cv2.THRESH_TOZERO_INV:如果像素值大于阈值,设置为 0,否则保持原值。
  • retval:返回值,通常是所用的阈值。如果是 THRESH_OTSUTHRESH_TRIANGLE,返回值为计算出的阈值。

  • dst:输出图像,二值化后的图像。

常见的阈值类型

  • cv2.THRESH_BINARY:传统的二值化,如果像素值大于阈值 thresh,则将其设为 maxval,否则设为 0(黑色)。
  • cv2.THRESH_BINARY_INV:反转的二值化。如果像素值大于阈值 thresh,则将其设为 0(黑色),否则设为 maxval(白色)。
  • cv2.THRESH_TRUNC:阈值截断。如果像素值大于 thresh,则将其值截断为 thresh,否则保持不变。
  • cv2.THRESH_TOZERO:如果像素值大于 thresh,则保持原值,否则设为 0。
  • cv2.THRESH_TOZERO_INV:反转的 TOZERO。如果像素值大于 thresh,则设为 0,否则保持原值。
优缺点:
  • 优点:实现简单,计算量小。
  • 缺点:阈值选取困难,尤其是图像背景与前景对比不明显时,效果不佳。

3.2 自适应阈值法

自适应阈值法是针对全局阈值法的一种改进,它根据图像局部区域的特征动态计算每个像素的阈值,适用于不同光照条件下的图像。自适应阈值法可以有效解决光照不均匀问题。

实现步骤:
  1. 将图像划分为多个小区域(通常是窗口)。
  2. 对每个小区域计算局部的阈值。
  3. 使用局部阈值进行二值化。
import cv2# 读取图像
image = cv2.imread('example.jpg', 0)# 自适应阈值
binary_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 2)# 显示结果
cv2.imshow("Binary Image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明

  • src:输入图像(必须是灰度图像,即单通道图像)。输入图像的类型可以是 CV_8U(8-bit unsigned integer),通常是灰度图像。

  • maxValue:最大值,即二值化后的最大像素值。通常设为 255,代表最大亮度。

  • adaptiveMethod:自适应阈值计算方法,有两种可选的计算方式:

    • cv2.ADAPTIVE_THRESH_MEAN_C:基于邻域区域的平均值来计算阈值。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:基于邻域区域的加权和(高斯加权)来计算阈值。
  • thresholdType:阈值类型,指定如何应用计算出的阈值:

    • cv2.THRESH_BINARY:大于阈值的像素设为 maxValue,否则设为 0(黑色)。
    • cv2.THRESH_BINARY_INV:与 cv2.THRESH_BINARY 相反,小于阈值的像素设为 maxValue,否则设为 0。
  • blockSize:邻域区域的大小(奇数)。它决定了用于计算每个像素阈值的区域大小。例如,blockSize=11 意味着每个像素的阈值是以一个 11x11 的邻域窗口计算的。必须是奇数(如 3, 5, 7, 9, 11 等)。

  • C:常数项,用于调整阈值。计算出的局部阈值会减去常数 C,它的作用是调节二值化的灵敏度。这个参数可以使阈值更高或更低,通常设置为一个小的整数(如 5 或 10)。

优缺点:
  • 优点:适应性强,能处理光照不均匀的图像。
  • 缺点:计算量较大,处理速度较慢。

3.3 Otsu's 阈值法

Otsu’s 阈值法是一种基于图像灰度分布的自动阈值选择方法,它通过最大化类间方差来选择最佳的阈值。该方法不需要人工设定阈值,适合于图像中前景和背景对比强烈的情况

实现步骤:
  1. 计算图像的直方图。
  2. 通过 Otsu 方法选择一个最优阈值,使得前景和背景的类间方差最大。
  3. 使用该阈值进行二值化。
import cv2# 读取图像
image = cv2.imread('example.jpg', 0)# 使用Otsu的阈值方法
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 显示结果
cv2.imshow("Binary Image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
优缺点:
  • 优点:无需人工设定阈值,自动化程度高,适用于对比度强的图像。
  • 缺点:当图像背景与前景不明显区分时,效果不理想。

4. 图像二值化的应用场景

4.1 光学字符识别(OCR)

OCR 技术用于从扫描的文档或图像中提取文字。二值化在 OCR 中起到了关键作用,通过将图像转换为黑白色,减少了干扰信息,增强了字符的对比度,进而提高了识别精度。

4.2 目标检测与分割

二值化常用于将目标与背景分离。在目标检测任务中,二值化有助于简化图像,快速提取出目标区域。

4.3 医学图像处理

在医学图像中,二值化常用于分割图像中的病变区域。例如,使用二值化处理 CT 或 MRI 图像,以提取肿瘤或其他异常组织的区域。

4.4 边缘检测

通过二值化后的图像,可以更加清晰地显示出图像的边缘,进而用于后续的边缘检测或轮廓提取等操作。


5. 总结

图像二值化是图像处理中非常基础且重要的操作。它将图像中的信息压缩为仅含两种颜色的图像,在许多领域中都有广泛应用。通过简单的阈值选择或更先进的自适应和 Otsu 方法,图像的前景和背景可以被清晰地分离出来,从而为后续的图像分析和处理提供便利。

  • 全局阈值法:简单高效,但在复杂图像中可能效果不好。
  • 自适应阈值法:适应性强,处理光照不均匀的图像效果好。
  • Otsu's 方法:自动选择最优阈值,适用于前景与背景对比明显的图像。

随着技术的不断发展,二值化技术在人工智能、医学影像、图像识别等领域的应用将越来越广泛。如果你也在处理图像时遇到二值化的需求,选择合适的算法将极大地提升你的工作效率和精度。

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

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

相关文章

概率论与数理统计总复习

复习课本:中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布(两点分布) 7.二项分布 8.帕斯卡分布(负二项分布&am…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

计算机网络期末复习(知识点)

概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…

IDEA Maven构建时报错:无效的目标发行版17

报错分析 报错原因:Maven 构建时,Java 版本配置不匹配 我安装的JDK版本是1.8,但由于种种原因,Maven构建时指定了 Java 17 作为目标发行版,从而导致错误 解决方案 首先,java -version,查看环…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本:关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时,部分文档已经修改,而大部分没有修改,为了减少在众多已打开文档中来回跳转的不便,可以将没有修改的文档全部关闭,但目前提供的快速关闭窗…

Knowledge Editing through Chain-of-Thought

题目 通过思路链进行知识编辑 论文地址:https://arxiv.org/abs/2412.17727 摘要 大型语言模型 (LLM) 在广泛的自然语言处理 (NLP) 任务中表现出卓越的能力。然而,由于频繁重新训练的成本很高,让这些模型与不断发展的世界知识保持同步仍然是一…

运行.Net 7 Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录,双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…

spark——RDD算子集合

目录 算子转换算子示例mapflatMapReduceByKeyfilterdistinctglomgroupBygroupByKeySortBysortByKeyunion交集intersection和差集subtractjoinpartitionBymapPartitionsample 行动算子示例ForeachPartitionForeachSaveAsTextFileCountByKeyReducefoldfirst、take、counttop、tak…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

Js的回调函数

一、什么是回调函数&#xff08;Callback&#xff09;&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是指一个函数被作为参数传递给另一个函数&#xff0c;并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中&#xff0…

OSPF - 1类LSA(Router-LSA)

前篇博客有对常用LSA的总结 1类LSA是OSPF计算最原始的材料&#xff0c;他会泛洪发给所有的路由器 LSA是包含在LSU中的&#xff0c;一条LSU能够携带多条LSA options位所有LSA都会有&#xff0c;用于标记起源于什么类型的区域&#xff0c;具体查看文章【邻居建立】 flags位是一…

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中&#xff0c;我们至少掌握了两种方法&#xff0c;可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现&#xff0c;相关学习链接为&#xff1a; python学opencv|读取图像&#xff08;三&#xff09;放大和缩小图像_python opencv 读取图…

实训云上搭建集群

文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …

继承(7)

大家好&#xff0c;今天我们继续来学习一下继承的知识&#xff0c;这方面需要大家勤动脑才能理解&#xff0c;那么我们来看。 1.9 protected关键字 在类和对象章节中&#xff0c;为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…

Flink三种集群部署模型

这里写自定义目录标题 Flink 集群剖析Flink 应用程序执行Flink Session 集群&#xff08;Session Mode&#xff09;Flink Job 集群&#xff08;以前称为per-job&#xff09;Flink Application 集群&#xff08;Application Mode&#xff09; 参考 Flink 集群剖析 Flink 运行时…

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境&#xff0c;用的是比较老的rabbitmq安装包&#xff0c;如下所示。经过一番折腾&#xff0c;死活服务起不来&#xff0c;最终果断放弃老版本启用新版本。现在把折腾过程记录下&#xff1a; 一、安装erlang 安装完成后的目录结构&#xff…

【深度学习】通俗理解偏差(Bias)与方差(Variance)

在统计学习中&#xff0c;我们通常使用方差与偏差来衡量一个模型 1. 方差与偏差的概念 偏差(Bais)&#xff1a; 预测值和真实值之间的误差 方差(Variance)&#xff1a; 预测值之间的离散程度 低偏差低方差、高偏差低方差&#xff1a; 图中每个点表示同一个模型每次采样出不同…