Python + OpenCV 系列:图像阈值处理

文章目录

        • 引言
      • 1. 阈值处理的基本概念
      • 2. OpenCV 中的阈值处理
      • 3. 常见的阈值类型
        • 3.1 二值化阈值
        • 3.2 反向二值化阈值
        • 3.3 截断阈值
        • 3.4 平滑阈值
      • 4. 自适应阈值
      • 5. Otsu’s 阈值法
      • 6. 阈值处理的应用场景
      • 7. 总结

引言

图像阈值处理是计算机视觉和图像处理中一种非常基础而重要的技术。通过阈值化操作,可以将图像的像素值按照一定标准分为两类,常用于图像分割、目标检测、文字提取等任务。阈值处理通过设置一个阈值来区分图像的前景与背景,对于提高图像分析效率至关重要。

在 Python 中,OpenCV 提供了便捷的函数来实现各种阈值处理技术。本文将深入介绍如何在 OpenCV 中使用阈值方法进行图像处理,并提供一些常用的阈值技术及应用示例。


1. 阈值处理的基本概念

图像的阈值处理是指根据图像的像素值与设定的阈值比较,将图像像素分为两类:一类是大于(或小于)阈值的像素,另一类是小于(或大于)阈值的像素。常见的图像阈值化结果通常是二值图像,也就是将图像像素值限定在两个可能的值(如0和255)。

阈值处理的目标是通过选择合适的阈值将图像的前景与背景分开,从而便于后续的图像分析任务。


2. OpenCV 中的阈值处理

在 OpenCV 中,阈值处理通过 cv2.threshold() 函数来实现。函数的基本语法如下:

retval, dst = cv2.threshold(src, thresh, maxval, type)
  • src:输入图像(灰度图)。
  • thresh:阈值。
  • maxval:最大像素值。
  • type:阈值类型,决定了如何进行阈值处理。

根据 type 参数的不同,cv2.threshold() 可以实现不同类型的阈值处理方法。


3. 常见的阈值类型

3.1 二值化阈值

最常见的阈值处理方法是二值化,即将大于某个阈值的像素设为最大值(通常是 255),小于阈值的像素设为最小值(通常是 0)。这种方法能够很好的将图像中的目标从背景中分离出来。

import cv2# 读取图像并转换为灰度图
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 设置阈值
thresh_value = 127# 二值化处理
ret, binary = cv2.threshold(img, thresh_value, 255, cv2.THRESH_BINARY)# 显示处理后的图像
cv2.imshow('Binary Threshold', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此代码中,cv2.THRESH_BINARY 表示二值化阈值法,阈值大于 127 的像素变为 255(白色),小于 127 的像素变为 0(黑色)。

3.2 反向二值化阈值

与二值化阈值相反,反向二值化阈值将小于阈值的部分设置为最大值,大于阈值的部分设置为最小值。

ret, binary_inv = cv2.threshold(img, thresh_value, 255, cv2.THRESH_BINARY_INV)cv2.imshow('Inverted Binary Threshold', binary_inv)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此代码中,cv2.THRESH_BINARY_INV 表示反向二值化,将小于阈值的像素设置为 255,大于阈值的像素设置为 0

3.3 截断阈值

截断阈值将大于阈值的部分设置为阈值本身,其他部分保持不变。截断阈值对于图像细节保留有帮助,但不适用于二值化场景。

ret, truncated = cv2.threshold(img, thresh_value, 255, cv2.THRESH_TRUNC)cv2.imshow('Truncated Threshold', truncated)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此代码中,cv2.THRESH_TRUNC 会将大于阈值的像素值截断为阈值本身,其他像素值不变。

3.4 平滑阈值

平滑阈值会将小于阈值的像素值设置为 0,大于阈值的像素值设置为阈值本身。它通常用于对图像进行轻微的模糊效果。

ret, tozero = cv2.threshold(img, thresh_value, 255, cv2.THRESH_TOZERO)cv2.imshow('ToZero Threshold', tozero)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此代码中,cv2.THRESH_TOZERO 表示将大于阈值的像素值保留,小于阈值的像素值设为 0


4. 自适应阈值

在一些光照不均的图像中,使用固定阈值可能无法得到好的结果。此时,我们可以使用自适应阈值技术,它会根据图像的局部区域自动态调整阈值。OpenCV 提供了 cv2.adaptiveThreshold() 函数来实现自适应阈值处理。

adaptive_thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)cv2.imshow('Adaptive Threshold', adaptive_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里,cv2.ADAPTIVE_THRESH_MEAN_C 表示计算邻域区域像素的均值作为阈值,11 是邻域区域的大小,2 是常数。


5. Otsu’s 阈值法

Otsu 的阈值法是一种自动选择最佳阈值的方法,它通过最大化类间方差来进行阈值选择,适用于图像灰度直方图呈现双峰特征的图像。在 OpenCV 中,可以通过 cv2.THRESH_OTSU 来启用 Otsu 阈值方法。

ret, otsu_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)cv2.imshow('Otsu Thresholding', otsu_thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

Otsu 的阈值法是根据图像的像素分布自动计算最佳的分割阈值,通常用于背景和前景对比明显的图像。


6. 阈值处理的应用场景

阈值处理广泛应用于以下领域:

  • 图像分割:将前景从背景中分离,常用于目标识别、图像分析等任务。
  • 文档分析:提取文档中的文本区域,进行 OCR(光学字符识别)处理。
  • 物体检测:检测图像中某些特定的物体或形状。
  • 医学影像分析:通过分割不同类型的组织或器官,辅助医生诊断。

7. 总结

图像阈值处理是图像处理中非常基础且重要的一步,能够将图像分为两类(前景与背景),从而为后续的图像分析和处理提供良好的基础。OpenCV 提供了多种阈值处理方法,包括常规的二值化、反向二值化、截断、平滑阈值法以及自适应阈值和 Otsu’s 阈值法。选择合适的阈值处理方法将大大提高图像分析的精度和效率。在实际应用中,根据不同的图像特性选择合适的阈值方法,是图像处理中的重要一步。

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

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

相关文章

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Vue3小兔鲜电商项目

创建项目 npm install 装包

【NLP 12、深度学习15条调参经验】

反正是绚烂,反正是到来 反正是背负慢慢凋残的孤独 耀眼的孤独,义无反顾的孤独 —— 24.12.9 深度学习15条调参经验 1.调参 调参是锦上添花的事,而底线取决于模型的选择和数据的清洗 2.关于model ① 尽量不要自己手写模型,找一…

美畅物联丨视频接入网关如何配置 HTTPS 证书

在安防领域,视频接入网关(Video Access Gateway,VAG)是视频监控系统的重要组成部分,其职责是把视频数据从前端设备传输至后端服务器。配置HTTPS证书后,可对视频流进行加密传输,避免数据在网络传…

fastcam编程套料软件

Fastcam是一款功能强大的专业软件,以下是对它的具体介绍: 基本信息 • Fastcam自1982年推出首个交互式CNC编程和套料系统后,一直不断更新发展. • 它是为数控火焰、等离子、激光和水射流切割机等数控切割机开发的编程套料软件. 主要功能模…

【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

【大语言模型】LangChain ModelsIO与Prompts详解 一、LangChain ModelsIO1、简介2、Models I/O 的应用场景3、Models I/O 主要模块3.1、Prompts3.2、Modelsa、MESSAGES 类型 3.3、Output Parsers 二、LangChain ModelsIO Prompts1、简介2、Prompts 的优点3、实战示例3.1、Promp…

MicroBlaze软核开发(三):DDR + FLASH

实现功能:使用 MicroBlaze软核,配置 DDR、Flash 接口,并将程序烧写固化到Flash,每次启动 FPGA 时自动运行 Flash 中的程序 。 Vivado版本:2018.3 FPGA:Xilinx Artix-7 系 目录 引言 Vivado部分&#xff1…

Springboot(五十三)SpringBoot3整合redisson

前边我们有记录Springboot2/3整合redis的方式。是基于Springboot默认集成的Lettuce客户端实现的。 今天我们在项目中集成的redission是在Lettuce之上构建的redis客户端。 Redisson:一个在Jedis和Lettuce之上构建的Redis客户端。提供了一系列分布式Java对象和服务,比如:分布式…

渗透测试基础

渗透测试基础是指对计算机系统、网络或应用程序进行模拟攻击,以发现其安全漏洞和潜在威胁的一种安全评估技术。通过模拟真实的攻击场景,渗透测试帮助组织了解其系统的安全弱点、验证防护措施的有效性,并提供改进建议。 渗透测试的核心概念 1…

ejb组件(rmi) webservice平台(xml)

springboot bean 在 Spring Boot 中,Bean 是 Spring 框架的核心概念之一,表示由 Spring 容器管理的对象。通过 Bean 或其他注解(如 Component、Service、Repository 等)来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…

11.23[大数据]

PRO1:LSTM模型预测输出都是同一个值? 画出来的图像就是一条横线 这个搜了搜,原因可能有很多,但感觉最主要的原因极可能是激活函数选择不当,以及层的搭建不合适 原模型是 REF https://zhuanlan.zhihu.com/p/654325094 https:/…

基于SpringBoot+Vue的新闻管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展,信息传播速度不断加快,新闻媒体行业面临着巨大的机遇与挑战。传统的新闻媒体正在逐渐向数字化转型,而新闻管理系统作为数字化新闻媒体的核心组成部分,其…

VCP-CLIP A visual context prompting modelfor zero-shot anomaly segmentation

GitHub - xiaozhen228/VCP-CLIP: (ECCV 2024) VCP-CLIP: A visual context prompting model for zero-shot anomaly segmentation 需要构建正样本,异常样本,以及对应的Mask

el-menu修改el-menu-item的高度后,里面的文字和图标高度没跟着变

解决方法 设置line-height的值和height一样。 <style lang"scss" scoped> .el-menu-item {height: 40px;line-height: 40px; } </style>

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…

MySQL-DDL之数据表操作

文章目录 一. 表的创建1. 表的创建2. 栗子 二. 查看表1. 查看数据库中的所有表2. 查看表结构 三. 删除表1. 删除表 四. 修改表结构1. 添加字段2. 修改字段3. 删除字段4. 修改表名 数据定义语言&#xff1a;简称DDL(Data Definition Language) 一. 表的创建 1. 表的创建 格式&…

【开源安全保护】如何安装JumpServer堡垒机

【开源安全保护】如何安装JumpServer堡垒机 什么是堡垒机 大家好&#xff0c;我是星哥&#xff0c;今天我以前来认识堡垒机 堡垒机&#xff08;Bastion Host&#xff09;&#xff0c;也称为跳板机&#xff08;Jump Server&#xff09;&#xff0c;是指在计算机网络中&#x…

【经典论文阅读】DDPM(Diffusion)

DDPM&#xff08;Diffusion&#xff09; denoising diffusion probabilistic models 【生成模型】DDPM概率扩散模型&#xff08;原理代码)-CSDN博客 【DDPM】一文看懂去噪扩散概率模型&#xff0c;公式讲解、代码实现与最全详解&#xff08;一&#xff09;-CSDN博客 【DDPM】…

RPC设计--TcpConnection和TcpServer

TcpConnection 对于服务端来说用来封装clientfd&#xff0c;对于client端来说&#xff0c;就是封装connect函数返回后的fd. 处理此fd上的读写&#xff0c;因此需要为其提供read\write方法&#xff0c;其方法内部调用系统的read\write函数&#xff0c;从fd中读写数据。 当Fd上…

重拾Java:穿越最具多功能性的编程语言之旅

你知道Java是世界上最广泛使用的编程语言之一吗&#xff1f;无论是用于Web应用、企业系统&#xff0c;还是Android开发&#xff0c;Java始终是各级开发者的可靠选择。 在完成SESI SENAI的系统开发技术培训后&#xff0c;我决定重新学习这门语言。现在&#xff0c;我将其与我正…