【OpenCV入门】第四部分——阈值

news2024/12/23 9:28:35

文章结构

  • 阈值概述
  • 阈值处理函数
  • 二值化阈值处理
    • 二值化阈值处理
    • 反二值化处理
  • 零处理
    • 低于阈值零处理
    • 超出阈值零处理
  • 截断处理
  • 自适应处理
  • Otsu方法

阈值概述

在PhotoShop里头,有一个工具可以快速抠出一幅图像中的轮廓,这个工具就是阈值。OpenCV也提供了阈值,且与PS里头的阈值有相同的作用。在OpenCV中,阈值是一个临界值,类似一个”像素值的标准线“。所有像素值都会与这条“标准线”进行比较,最后得到三种结果:像素值比阈值、像素值比阈值和像素值等于阈值。程序会根据这些结果将所有像素进行分组,然后对某一组像素进行“加深”或者“变淡”的操作,使得一幅图像的轮廓更加鲜明,更容易被计算机和肉眼识别。

阈值处理函数

在图像处理的过程中,阈值使得图像的像素值更单一,进而使得图像的效果更简单。

  • 首先,把一幅彩色图像转换为灰度图像,这样图像的像素值的取值范围即可简化为0 ~ 255。
  • 然后,通过阈值使得转换后的灰度图像呈现出只有黑色和白色的视觉效果。

例如,当阈值为127时,把小于127的所有像素值都转换为0(即黑色),把大于127的所有像素值都转换为255(即白色)。虽然会丢失一些灰度细节,但是会更明显地保留灰度图像整体的轮廓。

OpenCV提供了threshold()方法用于对图像进行阈值处理。

retval,dst = cv2.threshold(src, thresh, maxval, type)
  • src: 被处理的图像,可以是多通道图像
  • thresh: 阈值,阈值在125~150范围内取值的效果最好
  • maxval: 阈值处理采用的最大值
  • type: 阈值处理类型
  • retval: 处理时所采用的阈值
  • dst: 经过阈值处理后的图像
    在这里插入图片描述

二值化阈值处理

二值化处理会将灰度图像的像素值两极分化,使得灰度图像呈现出只有纯黑色和纯白色的视觉效果。经过阈值处理后的图像轮廓分明、对比明显,因此二值化处理常用于图像识别功能。

二值化阈值处理

该处理会让图像仅保留两种像素值,或者说所有的像素都只能从两种之中取值。进行二值化处理时,每一个像素都会与阈值进行比较,将大于阈值的像素值变为最大值,将小于或等于阈值的像素值变为0。通常二值化处理是使用255作为最大值,因为灰度图像中255表示白色,能够很清晰地与黑色进行区分。

实例1: 二值化阈值处理白黑渐变图

import cv2
img = cv2.imread("black.png", 0)  # 将图像读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理
cv2.imshow('img', img)  # 显示原图
cv2.imshow('dst1', dst1)  # 二值化阈值处理效果图
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:
在这里插入图片描述

通过修改阈值大小可以调整黑白交接的位置。通过修改最大值,非黑的像素就从纯白色变为灰色(其灰度值由最大值决定)

反二值化处理

反二值化处理的结果为二值化处理的相反结果。将大于阈值的像素值变为0,将小于或等于阈值的像素值变为最大值。原图像中白色的部分会变成黑色,黑色的部分会变成白色。

实例2: 对图像进行反二值化处理

import cv2
img = cv2.imread("black.png", 0)  # 将图像读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理
t4, dst4 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)  # 反二值化阈值处理
cv2.imshow('dst1', dst1)  # 展示二值化效果
cv2.imshow('dst4', dst4)  # 展示反二值化效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:
在这里插入图片描述

零处理

零处理会将某一个范围内的像素值变为0,并允许范围之外的像素保留原值。

低于阈值零处理

将低于或等于阈值的像素值变为0,大于阈值的像素值保持原值。

实例3:对图像进行低于阈值零处理

import cv2
img = cv2.imread("black.png", 0)  # 将图像读成灰度图像
t5, dst5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)  # 低于阈值零处理
cv2.imshow('img', img)  # 显示原图
cv2.imshow('dst5', dst5)  # 低于阈值零处理效果图
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:
在这里插入图片描述
图像经过低于阈值零处理后,颜色深的位置会彻底变黑,颜色浅的位置不受影响。彩色图像经过低于阈值零处理后,会让深颜色区域的颜色变得更深,甚至变黑。

超出阈值零处理

该处理会将大于阈值的像素值变为0,小于阈值的像素值保持原值。其过程与低于阈值零处理大致相同,类型为THRESH_TOZERO_INV。
图像经过超出阈值零处理后,浅颜色区域会彻底变黑,深颜色区域则不受影响。

截断处理

截断处理也叫阶段阈值处理,将图像中大于阈值的像素值变为和阈值一样的值,小于或等于阈值的像素保持原值。

实例4: 对图像进行截断处理

import cv2
img = cv2.imread("black.png", 0)  # 将图像读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 二值化阈值处理
t7, dst7 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)  # 截断处理
cv2.imshow('dst1', dst1)  # 展示二值化效果
cv2.imshow('dst7', dst7)  # 展示截断效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:
在这里插入图片描述

自适应处理

如果直接使用一种阈值处理类型对图像进行阈值处理,是无法得到清晰有效的结果的。对此,OpenCV提供了一种改进的阈值处理技术:图像中的不同区域使用不同的阈值,称为自适应阈值处理。

自适应阈值是根据图像中某一正方形区域内的所有像素值按照指定的算法计算得到的,能更好地处理明暗分布不均的图像,获得更简单的图像效果。OpenCV提供了adaptiveThreshold()方法用于对图像进行自适应阈值处理。

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
  • src: 被处理的图像,必须是灰度图像
  • maxValue: 阈值处理采用的最大值
  • adaptiveMethod: 自适应阈值的计算方法。
  • thresholdType: 阈值处理类型。只能是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV中的一个
  • blockSize: 一个正方形区域的大小。例如5指的是5×5的区域
  • C: 常量。阈值等于均值或者加权值减去这个常量
  • dst: 经过阈值处理后的图像

计算方法如下:
在这里插入图片描述

实例5: 显示自适应阈值处理的结果

import cv2
image = cv2.imread("4.27.png") # 读取4.27.png
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将4.27.png转换为灰度图像
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_MEAN_C
athdMEAM = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# 自适应阈值的计算方法为cv2.ADAPTIVE_THRESH_GAUSSIAN_C
athdGAUS = cv2.adaptiveThreshold\
    (image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 3)
# 显示自适应阈值处理的结果
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 销毁所有窗口

结果如下:
在这里插入图片描述

注意: 使用自定义阈值处理图像时,如果是彩色图像,需要先将彩色图像转换为灰度图像,否则会报错。

Otsu方法

逐个寻找最合适的阈值不仅工作量大,而且效率低。对此,OpenCv提供了Otsu方法,能够遍历所有可能的阈值,从中找到最合适的阈值。

Otsu方法的语法与threshold()方法的语法基本一致,只不过在为type传递参数时,要多传递一个参数,即cv2.THRESH_OTSU,其作用就是实现Otsu方法的阈值处理。

retval, dst = cv2.threshold(src, thresh, maxval, type)
  • src: 被处理的图像,必须是灰度图像
  • thresh: 阈值,且要把阈值设置为0
  • maxval: 阈值处理采用的最大值,即255
  • type: 阈值处理类型。除了在表5.1中选择一种阈值处理类型外,还要多传递一个参数,即cv2.THRESH_OTSU。例如,cv2.THRESH_BINARY + cv2.THRESH_OTSU
  • retval: 由Otsu方法计算得到并使用的最合适的阈值
  • dst: 经过阈值处理后的图像

实例6: 实现Otsu方法的阈值处理

import cv2
image = cv2.imread("4.36.jpg") # 读取4.36.jpg
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将4.36.jpg转换为灰度图像
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
# 实现Otsu方法的阈值处理
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY  + cv2.THRESH_OTSU)
cv2.putText(dst2, "best threshold: " + str(t2), (0, 30),
         cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) # 在图像上绘制最合适的阈值
cv2.imshow("BINARY", dst1) # 显示二值化阈值处理的图像
cv2.imshow("OTSU", dst2) # 显示实现Otsu方法的阈值处理
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 销毁所有窗口

结果如下:
在这里插入图片描述

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

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

相关文章

springboot实战(二)之将项目上传至远程仓库

目录 环境: 背景: 操作: 1.注册码云账号 2.创建仓库 步骤: 1.注册完码云账号后,点击加号,新建仓库 2.输入项目名称和介绍,点击创建 3.复制仓库地址,你可以选择https协议或者…

ClickHouse进阶(五):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…

ssm+vue宠物领养系统源码和论文

ssmvue宠物领养系统源码和论文103 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 本课题是根据用户的需要以及网络的优势建立的一个宠物领养系统,来满足用宠物领养的需求。 本宠物领养系统…

抖音短视频账号矩阵seo分发系统--开发源代

1.抖音矩阵号/抖音短视频SEO矩阵系统开发及开发者思路分享: 短视频获客系统开发原型支持短视频智能批量剪辑、短视频多账号管理定时发布,短视频排名查询及优化,智能客服私信回复等,那么短视频seo系统开发时需要开发哪些功能呢?今天…

全能图片转文字:多功能图片转换工具

全能图片转文字是一款功能丰富的图片转文字软件,通过OCR文字识别技术能够轻松识别图片中的文字信息,并快速提取转换成文本格式。除了支持图片转文字,全能图片转文字还可以完成音频转文字、视频转文字、截图转文字等操作,轻松满足日…

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于PSO-BiGRU、BiGRU时间序列预测; 2.单变量时间序列数…

春秋云镜 CVE-2018-20604

春秋云镜 CVE-2018-20604 lfdycms任意文件读取 靶标介绍 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发,适合各类视频、影视网站的影视内容管理程序,该CMS存在缺陷,可以通过 admin.php?s/Template/edit/path/web………*…*1.txt 的方…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 为什么要学习 ES? 强大的全文搜索和检索功能:Elasticsearch 是一个开源的分布式搜索和分析引擎,使用倒排索引和分布式计算等技术,提供了强大的全文搜索和检索功能。学习 ES 可以掌握如何构建复…

STM32实现FFT,求取幅度频谱

STM32实现FFT,求取幅度频谱 FFT不太对劲的理解 FFT的原理比较复杂,因为32使用FFT不用去管算法是如何运作的,我在这里就进行简单的介绍了。 因为是简单介绍,就只介绍下幅度频谱图,不考虑相位频谱图。 ​ FFT可以将一个…

管理类联考——逻辑——形式逻辑——汇总篇——知识点突破——综合推理

角度——重难点 综合推理条件优先级口诀 事实问题优先看,数量不定先计算。 半事实条件可分类,重复元素是关键。 题干如果多假言,就要优先做串联。 题干只有一假言,否后或者找矛盾。 特殊条件优先看,其他条件放后边。

Mybatis 插入、修改、删除

前面几篇我们介绍了使用Mybatis查询数据,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解,建议您先进行了解后再阅…

DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优

一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…

es6·await/async案例笔记

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>await/async案例笔记</title> </head> …

CXL 内存交织(Memory Interleaving)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

php在mysql创建数组字段的高效解决方案

案例说明 1.项目展示 将血糖的数值&#xff0c;按照下面表格的分类进行展示。 2.前端录入 将分类名称设置为单选项&#xff0c;血糖数值按照单选项的属性归属到对应的位置。 案例分析及操作步骤 1.在上面场景下&#xff0c;如何建立mysql数字字段&#xff1f; 如果每个…

10个免费PPT下载资源网站分享

PPT超级市场https://pptsupermarket.com/ PPT超级市场是一个完全免费的PPT模板下载网站&#xff0c;不需要注册登录&#xff0c;点击下载就能直接使用。 叮当设计https://www.dingdangsheji.com/ 叮当设计是一个完全免费的PPT模板下载网站&#xff0c;每一套PPT的质量都很高。除…

FileZilla使用密钥文件连接FSTP

文件-》站点管理-》新站点 右侧协议选择SFTP 填写主机和端口号 登录类型选择&#xff1a;密钥文件 填写用户名 选择密钥文件即可 注&#xff1a; 这里密钥文件默认只能选择.ppk&#xff1a; 如果你的密钥文件不是这个格式&#xff08;默认ssh生成的就不是&#xff09;&…

ZooKeeper数据模型/znode节点深入

1、Znode的数据模型 1.1 Znode是什么&#xff1f; Znode维护了一个stat结构&#xff0c;这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起&#xff0c;可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化&#xff0c;版本号就增加。…

CSS中如何实现元素的渐变背景(Gradient Background)效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS 渐变背景效果⭐ 线性渐变背景⭐ 径向渐变背景⭐ 添加到元素的样式⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

说说广播流与普通流

分析&回答 user actions 可以看作是事件流&#xff08;普通流&#xff09;patterns 为广播流,把全量数据加载到不同的计算节点。 广播流 Broadcast是一份存储在TaskManager内存中的只读的缓存数据在执行job的过程中需要反复使用的数据&#xff0c;为了达到数据共享&am…