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

文章结构

  • 阈值概述
  • 阈值处理函数
  • 二值化阈值处理
    • 二值化阈值处理
    • 反二值化处理
  • 零处理
    • 低于阈值零处理
    • 超出阈值零处理
  • 截断处理
  • 自适应处理
  • 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.rhkb.cn/news/114368.html

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

相关文章

MR混合现实汽车维修情景实训教学演示

MR混合现实技术应用于汽车维修课堂中,能够赋予学生更加真实,逼真地学习环境,让学生在情景体验中不断提高自己的专业能力。 MR混合现实汽车维修情景实训教学演示具体体现在: 1. 虚拟维修指导:利用MR技术,可…

【C++设计模式】详解装饰模式

2023年8月31日,周四上午 这是我目前碰到的最难的设计模式..... 非常难以理解而且比较灵活多半,学得贼难受,写得贼费劲..... 2023年8月31日,周四晚上19:48 终于写完了,花了一天的时间来学习装饰模式和写这篇博客。 …

基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOV8模型和CCPD数据集的车牌目标检测系统可用于日常生活中检测与定位车牌目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算…

【论文阅读】自动驾驶中车道检测系统的物理后门攻击

文章目录 AbstractIntroduction 论文题目: Physical Backdoor Attacks to Lane Detection Systems in Autonomous Driving(自动驾驶中车道检测系统的物理后门攻击) 发表年份: 2022-MM(ACM International Conference on…

Centos 7.6 安装mongodb

以下是在CentOS 7.6上安装MongoDB的步骤: 打开终端并以root用户身份登录系统。 创建一个新的MongoDB存储库文件 /etc/yum.repos.d/mongodb-org-4.4.repo 并编辑它。 sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo在编辑器中,添加下面的内容到文件中并…

【广州华锐互动】综合管廊3D可视化管理系统有效解决城市公用设施管理问题

在过去的几十年中,城市化进程不断加速,城市规模不断扩大,人口密度不断增加。这种发展带来了对城市基础设施的巨大需求,尤其是对电力、水、燃气和通信等公用设施的管理和维护。 为了满足这些需求,许多城市开始建设和管理…

Opencv基于文字检测去图片水印

做了一个简单的去水印功能,基于文字检测去图片水印。效果如下: 插件功能代码参考如下: using namespace cv::dnn; TextDetectionModel_DB *textDetector0; void getTextDetector() {if(textDetector)return;String modelPath "text_de…

【Redis】Redis 的学习教程(六)Redis 的缓存问题

在服务端中,数据库通常是业务上的瓶颈,为了提高并发量和响应速度,我们通常会采用 Redis 来作为缓存,让尽量多的数据走 Redis 查询,不直接访问数据库。 同时 Redis 在使用过程中(高并发场景下)也…

Ansible-palybook学习

目录 一.playbook介绍二.playbook格式1.书写格式2.notify介绍 一.playbook介绍 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。pl…

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章(点击跳转)uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管(点击跳转)uniapp项目实战系列(2):新建项目,项目搭建,微信开发工具…

Mac性能优化:深入了解WindowServer及其影响

文章目录 Mac性能优化:深入了解WindowServer及其影响WindowServer是什么?WindowServer为什么会占用那么多CPU?如何检查WindowServer是否使用了过多的CPU使用率?如何减少WindowServer的CPU使用率?Mac性能优化:深入了解WindowServer及其影响 大家好!今天我们来聊聊Mac上的…

【OJ比赛日历】快周末了,不来一场比赛吗? #09.03-09.09 #12场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-09-03(周日) #5场比赛2023-09-04…

函数(个人学习笔记黑马学习)

1、函数定义 #include <iostream> using namespace std;int add(int num1, int num2) {int sum num1 num2;return sum; }int main() {system("pause");return 0; } 2、函数的调用 #include <iostream> using namespace std;int add(int num1, int num2…

分布式锁实现一. 利用Mysql数据库update锁

文章目录 分布式锁1、什么是分布式锁&#xff1a;2、分布式锁应该具备哪些条件&#xff1a; 基于数据库的分布式锁代码传送代码运行 分布式锁 1、什么是分布式锁&#xff1a; 分布式锁&#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题…

常见的数据结构之队列

一、介绍 队列(Queue)是一种常见的数据结构,用于存储和管理一系列数据元素,其中元素按照 先进先出(First-In-First-Out,简称FIFO)的原则进行插入和删除。 队列可以类比为现实生活中排队等候的场景,例如在超市收银台排队购物的顾客队列。 二、队列的基本操作 2.1 出…

PHP8的箭头函数-PHP8知识详解

php 7.4 引入了箭头函数&#xff08;Arrow Functions&#xff09;&#xff0c;并在 PHP 8 中得到了进一步改进和扩展。 箭头函数是一种更简洁的匿名函数形式&#xff0c;它们提供了一种更便捷的方式来定义轻量级的、单行的回调函数。 箭头函数的语法如下&#xff1a; fn (参…

Docker拉取RocketMQ及可视化界面

本文介绍Docker拉取RocketMQ及可视化界面操作步骤 Linux下安装Docker请参考&#xff1a;Linux安装Docker 文章目录 安装namesrv创建挂载目录授权相关权限拉取镜像运行容器查看运行情况 安装Broker创建挂载目录及配置文件目录授权相关权限创建配置文件运行容器查看运行情况 安装…

2023年8月随笔之有顾忌了

1. 回头看 日更坚持了243天。 读《发布&#xff01;设计与部署稳定的分布式系统》终于更新完成 选读《SQL经典实例》也更新完成 读《高性能MySQL&#xff08;第4版&#xff09;》开更&#xff0c;但目前暂缓 读《SQL学习指南&#xff08;第3版&#xff09;》开更并持续更新…

KaiwuDB 助力能源企业实现 4 大价值提升

行业背景 近年来&#xff0c;随着能源行业数字化的不断推进&#xff0c;智能电网、可再生能源发电、分布式发电、微电网等技术蓬勃发展。越来越多的能源企业意识到数据管理与价值挖掘对储能及能源利用有着重大意义&#xff0c;并开始探索一套有效的数据库解决方案以应对分布式…

Redis 的混合持久化

RDB 相比于 AOF&#xff0c;数据恢复的速度更快&#xff0c;因为是二进制数据&#xff0c;直接加载进内存即可&#xff0c;但是 RDB 的频率不好把握。 如果频率太低&#xff0c;在两次快照期间服务器发生宕机&#xff0c;可能会丢失较多的数据如果频率太高&#xff0c;频繁写入…