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.概念:数据以文件的形式存储在存储介质上,每个文件都有一个唯一的文件名并存储在一个目录结构中。提供方便的文件访问接口,支持多种文件操作,如创建、删除、读取、写入、复制等。用于存储和管理个人文件,如文档、图片…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
