day5 - 利用阈值勾勒

阈值处理在计算机视觉技术中占有十分重要的位置,他是很多高级算法的底层逻辑之一。本实验将练习使用图像阈值处理技术来处理不同的情况的图像,并获得图像轮廓。

完成本期内容,你可以:

  • 了解图像阈值处理技术的定义和作用

  • 掌握各阈值处理技术的原理

  • 了解自适应阈值处理的使用场景

  • 学会选择合适的阈值处理方式

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


图像阈值处理函数

在图像处理过程中,阈值使得图像的像素值更单一,进而使得图像的效果更简单。首先把一幅彩色图像转换为灰度图像,这样图像的像素值的取值范围即可简化为0~255,然后通过阈值使用转换后的灰度图像呈现出只有黑色和宝白色的视觉效果。例如,当阈值为127时,把小于127的所有像素值都转换为0(即纯黑色),把大于127的像素值都转换为255(即纯白色),虽然会丢失一些灰度细节,但是会更明显的保留灰度图像主体的轮廓。

OpenCV中提供的对图像进行阈值处理的函数是cv2.threshold()。

函数原型: retval,dst = cv2.threshold(src, thresh, maxval, type);

retval为处理时所采用的阈值。

dst为转换后的图像。

参数描述如下:

参数描述
src原始图像
thresh阈值,阈值在125~150范围内取值的效果最好
maxval阈值处理采用的最大值
type阈值处理类型

阈值处理类型,如下:

类型含义
cv2.THRESH_BINARY二值化
cv2.THRESH_BINARY_INV反二值化阈值处理
cv2.THRESH_TOZERO低于阈值零处理
cv2.THRESH_TOZERO_INV超出阈值零处理
cv2.THRESH_TRUNC截断阈值处理

二值化处理

“非黑即白”的图像

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

if 像素值 <= 阈值: 
    像素值 = 0
if 像素值 > 阈值: 
    像素值 = 最大值

反二值化处理

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

if 像素值 <= 阈值: 
    像素值 = 像素值
if 像素值 > 阈值: 
    像素值 = 0

零处理

零处理会将某一个范围内的像素值变为0,并允许范围之外的像素保留原值。零处理包括低于阈值零处理和超出阈值零处理。

低于阈值零处理

低于阈值进行零处理也叫零阈值零处理,该处理会将低于或等于阈值的像素值变为0,大于阈值的像素值保持原值。

if 像素值 <= 阈值: 
    像素值 = 0
if 像素值 > 阈值: 
    像素值 = 原值

超出阈值零处理

超出阈值进行零处理也叫超阈值零处理,该处理会将大于阈值的像素值变为0,小于或等于阈值的像素值保持原值。

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 0

截断处理

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

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 阈值

自适应处理

OpenCV提供了一种改进的阈值处理技术:图像中不同区域使用不同的阈值,把这种改进的阈值处理技术称作自适应阈值处理,自适应阈值是根据图像中某一正方形区域内的所有像素值按照指定的算法计算得到的。与上文讲解的5中阈值处理类型相比,自适应阈值处理能更好地处理明暗分布不均的图像,获得更简单的图像。

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 阈值

OpenCV中提供的对图像进行自适应阈值处理的函数是cv2.adaptiveThreshold()。

函数原型: dst = cv2.adaptiveThreshold(src,maxValue,adaptiveMethod, threshholdType, blockSize, C);

dst为转换后的图像。

参数描述如下:

参数描述
src需要被处理的图像,该图像须是灰度图像
maxValue阈值处理采用的最大值
threshholdType阈值处理类型;需要注意的是,阈值处理类型必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV中的一个。
blockSize一个正方形区域的大小。
C常量。阈值等于均值或者加权值减去这个常量
adaptiveMethod自适应阈值的计算方法。

自适应阈值的计算方法,如下:

类型含义
cv2.ADAPTIVE_THRESH_MEAN_C对一个正方形区域内的所有像素平均加权
cv2.ADAPTIVE_THRESH_GAUSSIAN_C根据高斯函数按照像素与中心点的距离对一个正方形区域内的所有像素进行加权计算

Otsu方法

对于有些图像,当主观去设置阈值时,可能得到的效果并不好,这时就需要一个个的去尝试,知道找到最合适的阈值。逐个寻找最合适的阈值不仅工作量大,而且效率低。为此。OpenCV提供了Otsu方法,Otsu方法能够遍历所有可能的阈值,从中找到最合适的阈值。Otsu方法的语法和threshold()方法的语法基本一致。只不过在为type传递参数时,要多传递一个参数,cv2.THRESH_OTSU的作用是实现Otsu方法的阈值处理。

OpenCV中提供的对图像进行Otsu的函数是cv2.threshold()。

函数原型:retval,dst = cv2.threshold(src, thresh, maxval, type);

retval为处理时所采用的阈值。

dst为转换后的图像。

参数描述如下:

参数描述
src原始图像
thresh阈值,阈值在125~150范围内取值的效果最好
maxval阈值处理采用的最大值
type阈值处理类型

阈值处理类型,如下:

类型含义
cv2.THRESH_BINARY二值化
cv2.THRESH_BINARY_INV反二值化阈值处理
cv2.THRESH_TOZERO低于阈值零处理
cv2.THRESH_TOZERO_INV超出阈值零处理
cv2.THRESH_TRUNC截断阈值处理

具体步骤

1. 创建项目结构

创建项目名为利用阈值勾勒建筑轮廓,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

利用阈值勾勒建筑轮廓                      # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

2. 利用二值化阈值处理勾勒别墅轮廓图

  1. code文件夹下创建binary.py
  2. 读取dataset文件夹下的villa.png图片,并进行展示 ;
  3. 将图片进行二值化处理,并进行展示,标题为BINARY
  4. 将图片进行反二值化处理,并进行展示,标题为BINARY_INV
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread("../dataset/villa.png")
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化阈值处理
t1, dst1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 反二值化阈值处理
t2, dst2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("img", img)  # 显示图像
cv2.imshow("BINARY", dst1)
cv2.imshow("BINARY_INV", dst2)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

请添加图片描述

实验效果

3. 利用Otsu方法勾勒图像轮廓

  1. code文件夹下创建otsu.py
  2. 读取dataset文件夹下的tower.png图片,并进行展示 ;
  3. 将图片进行二值化处理,并进行展示,标题为BINARY
  4. 将图片进行Otsu处理,并进行展示,标题为Otsu
  5. 在图像上显示最合适的阈值;
  6. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2

# 读取图片
image = cv2.imread("../dataset/tower.png")

# 步骤一: 对图像进行二值化处理
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #转换为灰度图
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("img", image) # 显示原始图像图像
cv2.imshow("BINARY", dst1) # 显示二值化阈值处理的图像
cv2.imshow("OTSU", dst2) # 显示实现Otsu方法的阈值处理
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 销毁所有窗口

请添加图片描述

实验效果

阈值处理在计算机视觉 技术中占有十分重要的位置,他是很多高级算法的底层逻辑之一。因为二值图像会忽略细节,放大特征,而很多高级算法要根据物体的轮廓来分析物体的特征,所以二值图像非常适合做复杂的识别运算,在进行识别运算之前,应先将图像转为灰度图像,再进行二值化阈值处理,这样就得到了算法所需要的物体(大致)轮廓图像。

点击下载源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苏州狮山广场能耗管理系统

摘要&#xff1a;随着社会生活水平的提高&#xff0c;经济的繁荣发展&#xff0c;人们对能源的需求逐渐增长&#xff0c;由此带来的能源危机日益严重。商场如何实时的了解、分析和控制商场的能源消耗已成为需要解决的迫在眉睫的难题。传统的能源消耗智能以月/季度/年为周期进行…

Autosar RTE S/R接口implicit与Explicit的实现与区别

文章目录 前言接口的代码implicitIReadIWrite ExplicitReadWrite 区别与使用场景总结 前言 Autosar官方文档阅读起来比较费劲&#xff0c;一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别 接口的代码…

Node.js

目录 Node.js是什么 入门案例 fs文件系统模块 案例 http模块 创建最简单的web服务器 网页跳转案例 模块化 模块化概念 模块化规范 Node.js 中模块的分类 加载模块 模块作用域 module对象 Node.js中的模块化规范 第三方模块 (包) 安装包的命令 卸载包的命令 …

oracle客户端的安装教程

文章目录 一、安装前的准备工作 1.1、百度网盘安装包的连接 1.2、百度网盘oracle11g软件包 二、oracle数据库客户端的安装与数据的准备 安装步骤 前言 本文主要讲解oracle客户端的安装与简单使用过程 一、安装前的准备工作 1.1、百度网盘安装包的连接 客户端的软件包 …

【Java EE 初阶】网络编程套接字UDP

目录 1.为什么需要网络编程&#xff1f; 2.什么是网络编程&#xff1f; 3.发送端和接收端 4.请求和响应 5.客户端和服务端 6.如何进行网络编程&#xff08;Socket套接字&#xff09; 1.如何进行网络编程 2.TCP与UDP的区别 1.流套接字&#xff1a;使用传输层TCP协议 2.…

面了一个测试工程师要求月薪23K,总感觉他藏了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

【前端知识】Cookie, Session,Token和JWT的发展及区别(四)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;四&#xff09; 9. JWT9.1 JWT的背景及定义&#xff08;1&#xff09;JWT的字面理解&#xff08;2&#xff09;JWT与传统Token的区别 9.2 JWT的组成&#xff08;1&#xff09; Header&#xff08;头部&#xff…

【负载均衡式在线OJ】 数据库

文章目录 41.使用Postman进行综合调试42.了解-前端预备52. 添加oj用户到MySQL53. 使用MySQL_Workbench创建表结构54. 测试录题功能55.重新设计oj_model56.编写oj_model具体代码57.MySQL综合测试58.结项与项目扩展思路 41.使用Postman进行综合调试 完善判题功能 先编译再测试 …

项目管理PMP好考吗,没有经验?

现在越来越多的产品经理和开发人员也投入到考PMP的大军中&#xff0c;在真实的项目中也会有很多产品经理兼任项目经理的职责&#xff0c;这点还是比较常见的&#xff0c;如果说产品或者开发人员考了PMP证书&#xff0c;本身也会让你在找工作的大军中更具有优势&#xff0c;俗话…

一文读懂selenium自动化测试(基于Python)

前言 我们今天来聊聊selenium自动化测试&#xff0c;我们都知道selenium是一款web自动化测试的工具&#xff0c;它应该如何去运用呢?我们接着看下去。 ​1、Selenium简介&#xff1a; 1.1 Selenium&#xff1a; Selenium是一款主要用于Web应用程序自动化测试的工具集合。Sele…

Vue事件

1&#xff0c;回顾js中的事件&#xff1f; 答&#xff1a;标签的状态变化或者被外物改变则称为事件。一般js中的事件都是由浏览器捕捉得到&#xff0c;然后传递给js引擎&#xff0c;浏览器检测到HTML页面中某个标签元素发生了指定的事件&#xff0c;而对应的DOM节点必须去调用回…

Python系列模块之标准库re详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、Python 正则表达式 1.1 re模块常用操作 1.2 re.match 1.3 re.search 1.4 re.findall 1.5 re.compile 函数 1.6 re.sub 检索和替换 1.7 re.split拆分 1.8 实战案例&#xff1a;根据文…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

vs code 配置net 开发环境.并搭配vs相似的解决方案面板

由于在本人在Linux22.04下安装Rider 一直处于卡死系统状态.不得不使用该方式 以下为安装步骤 安装 VS code https://code.visualstudio.com/Download 安装 mono https://www.mono-project.com/download/stable/#download-lin 安装 NET SDK https://learn.microsoft.com/zh…

加拿大鹅Q4营收增长超30%,后续如何拿下更多“信任票”?

羽绒服行业正处在一个大混战的时代。有的品牌依托强势单品出海逆袭&#xff1b;有的品牌通过狂追当下Z世代的喜好&#xff0c;推翻经典设计&#xff1b;也有品牌“放下架子”在工厂忙起了特惠直播。在赛道愈发拥挤的背景下&#xff0c;羽绒服行业正在经历“地位”洗牌。 目前&…

如何在WordPress页面上显示或隐藏小部件?

您想在 WordPress 网站的特定页面上显示或隐藏小部件吗&#xff1f; 默认情况下&#xff0c;当您将小部件添加到您的网站时&#xff0c;它们将显示在所有页面上。但是&#xff0c;有时您可能只想在某些页面上显示选定的小部件可以帮助您更好地自定义您的网站并提供个性化的用户…

有哪些好用的App云测试平台?

一、国内外6种好用app云测平台推荐&#xff08;章节末附pk图&#xff09; 1、国内云测平台 1&#xff09;Testin云测 网址&#xff1a;https://www.testin.cn/ Testin云测平台是一款基于云端的移动应用测试平台&#xff0c;为移动应用开发者和测试人员提供一站式的移动应用质…

让数据背后的那些话创造价值 | 数据增长

从行业背景而言&#xff0c;流量红利逐渐消失&#xff0c;野蛮生长的互联网时代接近尾声。传统的烧钱模式、靠体力投放的形式日渐乏力。但是&#xff0c;企业总是要追求增长的。所以在行业大背景下&#xff0c;依靠技术和数据的力量寻求更科学、更高效的方法达成营销目标&#…

关注 | 蛙色元宇宙,正式成为XRMA联盟成员单位

中国虚拟现实与元宇宙产业峰会&#xff0c;2023年3月22日于杭州圆满结束&#xff0c;在杭州市人民政府、浙江省经济和信息化厅指导&#xff0c;由杭州市经济和信息化局、杭州市西湖区人民政府主办&#xff0c;中国信息通信研究院承办。 蛙色元宇宙作为元宇宙的领先企业之一&…

springboot旅游资源管理系统门票酒店预订系统_b0a6b

Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行开发的过程。config&#xff1a;主要用来存储配置文件&#…