2024-12-05OpenCV高级-滤波与增强
OpenCV高级-滤波与增强
文章目录
- OpenCV高级-滤波与增强
- 1-OpenCV平滑滤波
- 1. 均值滤波 (`cv2.blur()`)
- 2. 高斯滤波 (`cv2.GaussianBlur()`)
- 3. 中值滤波 (`cv2.medianBlur()`)
- 4. 双边滤波 (`cv2.bilateralFilter()`)
- 总结
- 2-OpenCV边缘检测
- 1. Sobel算子 (`cv2.Sobel()`)
- 2. Canny边缘检测 (`cv2.Canny()`)
- 3. Laplacian算子 (`cv2.Laplacian()`)
- 4. Prewitt算子
- 总结
- 3-OpenCV形态学操作
- 1. 腐蚀 (`cv2.erode()`)
- 2. 膨胀 (`cv2.dilate()`)
- 3. 开运算(先腐蚀后膨胀)
- 4. 闭运算(先膨胀后腐蚀)
- 5. 形态学梯度
- 6. 顶帽变换
- 7. 黑帽变换
- 总结
1-OpenCV平滑滤波
在OpenCV中,平滑滤波(也称为模糊滤波)是一种常用的图像处理技术,用于减少图像中的噪声并平滑图像。以下是使用OpenCV实现均值滤波、高斯滤波、中值滤波和双边滤波的具体方法:
1. 均值滤波 (cv2.blur()
)
均值滤波通过计算邻域内像素的平均值来平滑图像。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg')# 应用均值滤波
smoothed_image = cv2.blur(image, (5, 5)) # 5x5的滤波器# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Smoothed Image (Mean Blur)', smoothed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 高斯滤波 (cv2.GaussianBlur()
)
高斯滤波使用高斯函数的权重来计算邻域内像素的加权平均值,对图像进行平滑。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 应用高斯滤波
smoothed_image = cv2.GaussianBlur(image, (5, 5), 0) # 5x5的滤波器,标准差为0(自动计算)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Smoothed Image (Gaussian Blur)', smoothed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 中值滤波 (cv2.medianBlur()
)
中值滤波通过计算邻域内像素的中值来平滑图像,对椒盐噪声有很好的去除效果。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 应用中值滤波
smoothed_image = cv2.medianBlur(image, 5) # 5x5的滤波器# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Smoothed Image (Median Blur)', smoothed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 双边滤波 (cv2.bilateralFilter()
)
双边滤波在平滑图像的同时保留图像的边缘信息,通过结合空间距离和像素值差异的权重来实现。
import cv2# 读取图像
image = cv2.imread('image.jpg')# 应用双边滤波
smoothed_image = cv2.bilateralFilter(image, 9, 75, 75) # 9是邻域直径,75是颜色空间和坐标空间的标准差# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Smoothed Image (Bilateral Filter)', smoothed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
- 均值滤波 (
cv2.blur
): 简单平均,适用于去除高斯噪声。 - 高斯滤波 (
cv2.GaussianBlur
): 加权平均,适用于去除高斯噪声,同时保留更多图像细节。 - 中值滤波 (
cv2.medianBlur
): 中值处理,适用于去除椒盐噪声。 - 双边滤波 (
cv2.bilateralFilter
): 结合空间距离和颜色差异的权重,适用于去除噪声的同时保留边缘。
这些方法可以根据具体的图像处理需求选择使用。
2-OpenCV边缘检测
在OpenCV中,边缘检测是一种常用的图像处理技术,用于检测图像中的边缘和轮廓。以下是使用OpenCV实现Sobel算子、Canny边缘检测、Laplacian算子和Prewitt算子的具体方法:
1. Sobel算子 (cv2.Sobel()
)
Sobel算子是一种常用的边缘检测算子,它通过计算图像的梯度来检测边缘。Sobel算子分别计算图像在x方向和y方向的梯度,然后结合这两个梯度来得到边缘强度。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 应用Sobel算子
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3) # x方向梯度
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3) # y方向梯度# 计算梯度幅值
sobel_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)
sobel_magnitude = np.uint8(sobel_magnitude)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel Edge Detection', sobel_magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. Canny边缘检测 (cv2.Canny()
)
Canny边缘检测是一种多阶段的边缘检测算法,通过计算图像的梯度,然后应用非极大值抑制和双阈值检测来提取边缘。
import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 应用Canny边缘检测
canny_edges = cv2.Canny(image, 100, 200) # 100和200是阈值# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Canny Edge Detection', canny_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. Laplacian算子 (cv2.Laplacian()
)
Laplacian算子是一种二阶导数算子,通过计算图像的拉普拉斯变换来检测边缘。
import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 应用Laplacian算子
laplacian_edges = cv2.Laplacian(image, cv2.CV_64F)
laplacian_edges = np.uint8(np.absolute(laplacian_edges))# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Laplacian Edge Detection', laplacian_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. Prewitt算子
Prewitt算子与Sobel算子类似,也是一种一阶导数算子,用于计算图像的梯度。由于OpenCV没有直接提供Prewitt算子,我们可以手动定义Prewitt算子并应用。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# Prewitt算子
prewitt_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])
prewitt_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])# 应用Prewitt算子
prewitt_x_edges = cv2.filter2D(image, -1, prewitt_x)
prewitt_y_edges = cv2.filter2D(image, -1, prewitt_y)# 计算梯度幅值
prewitt_magnitude = np.sqrt(prewitt_x_edges**2 + prewitt_y_edges**2)
prewitt_magnitude = np.uint8(prewitt_magnitude)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Prewitt Edge Detection', prewitt_magnitude)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
- Sobel算子 (
cv2.Sobel
): 一阶导数算子,检测图像在x和y方向的梯度。 - Canny边缘检测 (
cv2.Canny
): 多阶段算法,通过非极大值抑制和双阈值检测提取边缘。 - Laplacian算子 (
cv2.Laplacian
): 二阶导数算子,检测图像的拉普拉斯变换。 - Prewitt算子: 一阶导数算子,与Sobel算子类似,可以使用
cv2.filter2D
手动实现。
这些方法可以根据具体的图像处理需求选择使用。
3-OpenCV形态学操作
在OpenCV中,形态学操作是一种基于图像形状的处理技术,常用于图像的预处理、特征提取和噪声去除。以下是使用OpenCV实现腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽变换和黑帽变换的具体方法:
1. 腐蚀 (cv2.erode()
)
腐蚀操作通过使用一个结构元素(通常是一个小的矩形或圆形)来侵蚀图像的边缘,从而消除小的对象或噪声。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Eroded Image', eroded_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 膨胀 (cv2.dilate()
)
膨胀操作通过使用一个结构元素来扩展图像的边缘,从而填充小的空洞或连接断裂的边缘。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 开运算(先腐蚀后膨胀)
开运算通过先腐蚀后膨胀来消除小的对象或噪声,同时保留大的对象。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用开运算
opening_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Opening Image', opening_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 闭运算(先膨胀后腐蚀)
闭运算通过先膨胀后腐蚀来填充小的空洞,同时保留大的对象。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用闭运算
closing_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Closing Image', closing_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 形态学梯度
形态学梯度通过膨胀图像与腐蚀图像的差值来突出图像的边缘。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用形态学梯度
gradient_image = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Morphological Gradient', gradient_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 顶帽变换
顶帽变换通过原图像与开运算结果的差值来突出图像中的细小对象或噪声。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用顶帽变换
tophat_image = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Top Hat Transform', tophat_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 黑帽变换
黑帽变换通过闭运算结果与原图像的差值来突出图像中的细小空洞或断裂。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 定义结构元素
kernel = np.ones((5, 5), np.uint8)# 应用黑帽变换
blackhat_image = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Black Hat Transform', blackhat_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
- 腐蚀 (
cv2.erode
): 消除小的对象或噪声。 - 膨胀 (
cv2.dilate
): 填充小的空洞或连接断裂的边缘。 - 开运算 (
cv2.morphologyEx(..., cv2.MORPH_OPEN)
): 先腐蚀后膨胀,消除小的对象或噪声。 - 闭运算 (
cv2.morphologyEx(..., cv2.MORPH_CLOSE)
): 先膨胀后腐蚀,填充小的空洞。 - 形态学梯度 (
cv2.morphologyEx(..., cv2.MORPH_GRADIENT)
): 突出图像的边缘。 - 顶帽变换 (
cv2.morphologyEx(..., cv2.MORPH_TOPHAT)
): 突出细小对象或噪声。 - 黑帽变换 (
cv2.morphologyEx(..., cv2.MORPH_BLACKHAT)
): 突出细小空洞或断裂。
这些方法可以根据具体的图像处理需求选择使用。
相关文章:
2024-12-05OpenCV高级-滤波与增强
OpenCV高级-滤波与增强 文章目录 OpenCV高级-滤波与增强1-OpenCV平滑滤波1. 均值滤波 (cv2.blur())2. 高斯滤波 (cv2.GaussianBlur())3. 中值滤波 (cv2.medianBlur())4. 双边滤波 (cv2.bilateralFilter())总结 2-OpenCV边缘检测1. Sobel算子 (cv2.Sobel())2. Canny边缘检测 (cv…...
vue3中 axios 发送请求 刷新token 封装axios
service.js 页面 import axios from axios // 创建axios实例 const instance axios.create({baseURL: http://gcm-test.jhzhkj.cn:8600/h5card/,timeout: 5000, // 请求超时时间headers: {get: {Content-Type: application/x-www-form-urlencoded},post: {Content-Type: appl…...

aardio - 汉字笔顺处理 - json转sqlite转png
本代码需要最新版 godking.conn 库,请自行下载! 如果没有安装 odbc for sqlite 驱动,可以使用 godking.conn.driver.sqlite3.install() 安装。 也可以在此下载自行安装:http://www.chengxu.online/show.asp?softid267 1、将js…...

数据结构学习笔记 双向链表
……接上文 6. 双向链表 6.1 特性 逻辑结构:线性结构 存储结构:链式结构 操作:增删改查 建立双向链表结构体: //双向链表的节点定义 typedef int datatype;typedef struct node_t{datatype data;//数据域 struct node_t *next;//…...

深度学习作业十 BPTT
目录 习题6-1P 推导RNN反向传播算法BPTT. 习题6-2 推导公式(6.40)和公式(6.41)中的梯度. 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时, 分析其可能存在梯度爆炸的原因并给出解决方法. 习题6-2P 设计简单RNN模型࿰…...
html+css+JavaScript实现轮播图
html+css+JavaScript实现轮播图 实现思路 要实现一个轮播图功能,我们需要HTML来构建结构,CSS来设计样式,以及JavaScript来添加交互功能。下面我将分别分析这三个部分是如何协同工作来实现轮播图的。 HTML - 结构 HTML部分定义了轮播图的基本结构,包括图片列表、指示器和…...
Python+onlyoffice 实现在线word编辑
onlyoffice部署 version: "3" services:onlyoffice:image: onlyoffice/documentserver:7.5.1container_name: onlyofficerestart: alwaysenvironment:- JWT_ENABLEDfalse#- USE_UNAUTHORIZED_STORAGEtrue#- ONLYOFFICE_HTTPS_HSTS_ENABLEDfalseports:- "8080:8…...
PostgreSQLt二进制安装-contos7
1、安装依赖 yum install -y gcc readline readline-devel zlib-devel net-tools perl wget numactl libicu-devel bison flex openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel openldap openldap-devel 2、创建目录 mkdir -p /data/postgresql/{…...

Neo4j启动时指定JDK版本
项目使用jdk1.8,同时需要安装neo4j5.15版本,使用jdk17. 1.mac或者liunx,找到neo4j目录bin的下neo4j文件 设置JAVA_HOME: 2.windows,找到bin下面的neo4j.bat文件 set "JAVA_HOME{JDK文件目录}" 重启后生效。...

kanzi3.6.10 窗口插件-美化绑定内容
文章目录 1. 创建kanzi窗口插件2. 业务逻辑3. 关键代码3.1 获取绑定信息3.2 解析绑定3.3 动态生成富文本控件 4. 安装 背景:kanzi的节点绑定信息是黑色的,看起来非常费劲,如果能代码高亮显示,对开发会很有帮助。 美化前 美化后 …...

利用tablesaw库简化表格数据分析
tableaw是处理表格数据的优秀工具。它提供了一组强大而灵活的功能,使操作、分析和可视化数据表变得容易。在这篇博文中,我们将介绍tableaw的主要特性、如何使用这些特性,以及如何使用tableaw处理表格数据的一些示例。 tablesaw简介 tableaw…...

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009
项目是个老项目,依赖包也比较大,咱就按正常流程走一遍来详细解决这个问题,先看一下node版本,我用的是nvm管理的,详细可以看我的其他文章 友情提醒:如果项目比较老,包又大,又有一些需…...

【JavaWeb后端学习笔记】MySQL的数据查询语言(Data Query Language,DQL)
MySQL DQL 1、DQL语法与数据准备1.1 DQL语法1.2 数据准备 2、基础查询2.1 查询指定字段2.2 查询返回所有字段2.3 给查询结果起别名2.4 去除重复记录 3、条件查询3.1 条件查询语法3.2 条件查询案例分析 4、分组查询4.1 分组查询语法4.2 分组查询案例分析 5、排序查询5.1 排序查询…...
360 最新Android面试题及参考答案
一个 activity 只能有一个进程么【对进程的理解】 在 Android 中,一个 Activity 并不只能有一个进程。进程是操作系统进行资源分配和调度的一个独立单位。 从原理上来说,Android 系统允许开发者通过在 AndroidManifest.xml 文件中的<activity>标签设置 android:process…...

《操作系统 - 清华大学》6 -3:局部页面置换算法:最近最久未使用算法 (LRU, Least Recently Used)
文章目录 1. 最近最久未使用算法的工作原理2. 最近最久未使用算法示例3.LRU算法实现3.1 LRU的页面链表实现3.2 LRU的活动页面栈实现3.3 链表实现 VS 堆栈实现 1. 最近最久未使用算法的工作原理 最近最久未使用页面置换算法,简称 LRU, 算法思路ÿ…...
ES6新增了哪些特性(待更新)
1.let,const 1.1.var,let,const的区别 1.1.1 var存在变量提升,let和const不存在。 1.1.2 let和const只能在块作用域里访问。 1.1.3 同一作用域下let和const不能声明同名变量,而var可以。 1.1.4 const定义常量&am…...

剖析一下自己的简历第二条
剖析一下自己的简历第二条 背景前置说明可能会被问到的问题 背景 剖析一下自己简历, 增加对一些专业知识的掌握. 我的简历第二条是这样写的: “2. 熟悉JVM、JMM,包括内存模型,垃圾回收机制,了解其基本调优技巧并具备线上调优经验。”. 前置…...

威联通-001 手机相册备份
文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…...

性能测试基础知识jmeter使用
博客主页:花果山~程序猿-CSDN博客 文章分栏:测试_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 性能指标 1. 并发数 (Con…...
Ceph文件存储
Ceph文件存储1.概念:数据以文件的形式存储在存储介质上,每个文件都有一个唯一的文件名并存储在一个目录结构中。提供方便的文件访问接口,支持多种文件操作,如创建、删除、读取、写入、复制等。用于存储和管理个人文件,如文档、图片…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...