day5 - 利用阈值勾勒

news2024/12/23 23:06:27

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

完成本期内容,你可以:

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

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

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

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

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

  • 操作系统: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() # 销毁所有窗口

请添加图片描述

实验效果

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

点击下载源码

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

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

相关文章

PyQt5 使用 pyinstaller打包文件(speed)

编写界面 import sys,math from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt from PyQt5.QtGui import *class RightBottomButton(QWidget) :def __init__(self):super(RightBottomButton,self).__init__()self.setWindowTitle("界面One")self.resize(400…

1.8G专网工业路由器促进4G智能电力建设,赋能配电站远程监控管理

TD-LTE已是当下成熟的4G通信技术&#xff0c;应用无线专网的场景也越来越多&#xff0c;4G技术在电力物联网中也得到了广泛应用。依托传统的人工监管方式&#xff0c;效率低、成本高、维护难&#xff0c;为促进4G智能电力建设迫切需要方便快捷的在线监控方式来及时发现电力配网…

xss跨站,订单,shell箱子反杀记

打开一个常见的订单靶场&#xff0c;老师自己搭建的 这个是可以进行xss漏洞的测试&#xff0c;凡是有这种数据交互的地方&#xff0c;前端有一个数据的接受&#xff0c;后端是数据的显示&#xff0c;这个过程就符合漏洞产生的前提条件&#xff0c;将输入的数据进行个显示&#…

BUUCTF-Basic部分(4道)

目录 Linux Labs BUU LFI COURSE 1 BUU BRUTE 1 BUU SQL COURSE 1 Linux Labs 第一个界面&#xff0c;给出了SSH ssh 用户名&#xff1a;root 密码&#xff1a;123456 地址和端口为动态分配的 以及映射地址和端口&#xff08;这个地址端口是随机的&#xff09; node4.buuoj.c…

R语言实践——使用 rWCVP 生成自定义清单

使用 rWCVP 生成自定义清单 介绍1. 特有物种清单2. 近特有物种清单2.1 在塞拉利昂和另一地区出现的物种2.2 在塞拉利昂和相邻地区出现的物种 3. 生成自定义报告 介绍 除了允许用户从世界维管植物名录&#xff08;WCVP&#xff09;创建清单外&#xff0c;rWCVP还提供了修改清单…

在小公司“混”了2年,我只认真做了5件事,如今顺利拿到字节 Offer

前言 是的&#xff0c;我一家小公司工作了整整两年时间&#xff0c;在入职这家公司前&#xff0c;也就是两年前&#xff0c;我就开始规划了我自己的人生&#xff0c;所以在两年时间里&#xff0c;我并未懈怠。 现如今&#xff0c;我已经跳槽到了字节&#xff0c;入职字节测试…

傅里叶级数 傅里叶变换 及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具&#xff0c;它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号&#xff0c;可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

Netty编解码机制(二)

1.Netty入站和出站机制 1.1.基本介绍 1>.netty的组件设计: Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等; 2>.ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器.例如,实现ChannelInboundHandler接口(或ChannelInb…

Unity之如何接入google cardboard-xr-plugin实现android手机VR

前言 我们提到VR,总是会想到Oculus,HTC Vive,Pico等头戴VR设备,但是别忘了,最早Google就通过再手机端实现VR了,而且还推出过Cardboard手机盒子,让我们可以用最低的成本体验到VR效果。 插件下载 先说明一下,Unity在1028版本之前,支持过GoogleVR,但是后来因为统一…

Chapter8 :Physical Constraints(ug903)

8.1About Physical Constraints&#xff08;关于物理约束&#xff09; XilinxVivado集成设计环境&#xff08;IDE&#xff09;允许通过设置对象属性值对设计对象进行物理约束。示例包括&#xff1a; •I/O约束&#xff0c;如位置和I/O标准 •布局约束&…

惨败字节,苦心备战两个月斩获阿里offer,这份“258页软件测试面试宝典”也太顶了

测试三年有余&#xff0c;很多新学到的技术不能再项目中得到实践&#xff0c;同时薪资的涨幅很低&#xff0c;于是萌生了跳槽大厂的想法。 但大厂不是那么容易进的&#xff0c;前面惨败字节&#xff0c;为此我辛苦准备了两个月&#xff0c;又从小公司开始面试了半个月有余&…

k8s pv pvc的介绍|动态存储|静态存储

k8s pv pvc的介绍|动态存储|静态存储 1 emptyDir存储卷2 hostPath存储卷3 nfs共享存储卷4 PVC 和 PVNFS使用PV和PVC 4 搭建 StorageClass NFS&#xff0c;实现 NFS 的动态 PV 创建 1 emptyDir存储卷 当Pod被分配给节点时&#xff0c;首先创建emptyDir卷&#xff0c;并且只要该…

FPGA—可乐机拓展训练题(状态机)

题目&#xff1a;以可乐机为背景&#xff0c;一瓶可乐的价格还是 2.5 元。用按键控制投币&#xff08;加入按键消抖功能&#xff09;&#xff0c;可以投 0.5 元硬币和 1 元硬币&#xff0c;投入 0.5 元后亮一个灯&#xff0c;投入 1 元后亮 2 个灯&#xff0c;投入 1.5 元后亮 …

【统计模型】学生课程类型选择影响因素分析

目录 学生课程类型选择影响因素分析 一、研究目的 二、数据来源和相关说明 三、描述性分析 3.1 样本描述 3.2 样本可视化 3.2.1 直方图 3.2.2 列联表 3.2.3 箱线图与折线图 3.2.4 相关性热力图 四、数学建模 4.1 无序多分类logistic回归模型 4.1.1 无序多分类logist…

STM32F030C8T6最小系统板和流水灯(原理图和PCB)

STM32F030C8T6最小系统板和流水灯。 嵌入式课的课程设计&#xff0c;要做个流水灯&#xff0c;我就顺便画个最小系统板&#xff0c;开源出来了&#xff0c;各位大佬指点指点&#xff0c;有哪里需要优化改进的。 那个WS2812的RGB灯用错引脚了&#xff0c;所以没法用PWM来控制&…

MQTT GUI 客户端 可视化管理工具

MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理&#xff0c;同时打开多个连接提供原生性能&#xff0c;并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多支持 MQTT v5.0 以及 MQTT v3.1.1 协议&#xff0c;支持通过 WebSocket 连接至 MQTT 服务器以树…

数字信号处理7

昨天着重就是离散时间系统的复习&#xff0c;包括离散时间系统的分类有哪些&#xff0c;是根据什么进行分类的&#xff0c;要搞清楚&#xff0c;LTI系统是一个什么样的系统&#xff0c;以及卷积的操作&#xff0c;因果LTI等&#xff0c;回顾完这些之后&#xff0c;就开始了今天…

Python面向对象编程详细解析(都带举例说明!)

前言 Python面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它将数据和操作数据的方法封装在一起&#xff0c;形成一个对象。 Python中的面向对象编程包括以下内容&#xff1a; 目录点击对应章节可直接跳转…

数据治理项目易失败?企业数据治理的解决思路在这里

据Gartner 的一项调查显示&#xff0c;我国超过90%的数据治理项目都失败了。大家的感受也是如此&#xff1a;数据治理的项目不好落地&#xff0c;数据治理项目实施起来从理论到实践有一条巨大的鸿沟很难跨越。 失败的原因各种各样&#xff0c;总结起来大概有4类&#xff1a; …

编译原理个人作业--第六章——基于 编译原理 国防工业出版社 第三版

2 对表达式((a)(b)) (1) 按照表6.4属性文法构造抽象语法树 (2) 按6.17翻译模式构造表达式抽象语法树 5(1) 下列文法对整型常数、实型常熟世家加法运算符 生成表达式&#xff0c;当两个整型数相加&#xff0c;结果为整形&#xff0c;否则结果为实型 E → E T ∣ T E\r…