opencv#32 可分离滤波
滤波的可分离性
就是将一个线性滤波变成多个线性滤波,这里面具体所指的是变成x方向的线性滤波和y方向的线性滤波。无论先做x方向的滤波还是y方向滤波,两者的叠加结果是一致的,这个性质取决于滤波操作是并行的,也就是每一个图像在滤波的时候,图像滤波区域内的像素是独立进计算的,如果性能允许,我们可以在整个图像内同时计算。
可分离滤波的含义
线性滤波可以将滤波器分解为x方向和y方向两个滤波器,并且滤波结果与顺序无关。

比如现在有行滤波器和列滤波器,这两个滤波器分别作用在图像中,比如先用行滤波器进行处理,之后再进行列滤波器对图像进行处理,得到的结果与行和列滤波器乘在一起的整体(联合)滤波器对图像进行滤波所得到的结果是一致的。
进行滤波器分离后,好处是滤波时采用的数据变少了,因为进行行滤波时,使用的是三个数据,进行列滤波时,使用的是三个数据,而如果直接用联合滤波器使用的是九个数据,从上可知,分离滤波可以极大缩减滤波处理时间,同时也为cpu这种串行处理器上实现滤波加速成为可能。
高斯滤波器用分离形式表示:

可表示成一个列滤波器和一个行滤波器,这两个滤波器的乘积可得到一个联合(整体)滤波器。若先对第一个列滤波器对图像进行操作,得到结果后,再将此结果输入到下一个行滤波器中,得到的最终结果与图像直接输入到联合滤波器中的结果是一致的。这样的形式可以实现两个方向上不同的滤波,例如在行上用5*5尺寸的滤波器,而在列上用3*3尺寸的滤波器,这样可以增大灵活性。
可分离滤波函数
sepFilter2D()
void cv::sepFilter2D(InputArray src,OutputArray dst,int ddepth,InputArray kernelX,InputArray kernelY,Point anchor = Point(-1,-1),double deta = 0;int borderType = BORDER_DEFAULT)
·src:待滤波图像。
·dst:输出图像,与输入图像src具有相同的尺寸,通道数和数据类型。
·ddepth:输出图像的数据类型(深度),可以通过此参数修改输出图像的数据类型,因为滤波与卷积相类似,卷积过程中 可能在求和时使数据变得更大,例如方框滤波,所得结果远大于原先数据,若此时还使用原数据类型,那么可能会造成数据丢失,因此允许从此参数去设置输出的数据类型。
·kernelX:X方向的滤波器。
·kernelY:Y方向的滤波器。
·anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。
·delta:偏值,在计算结果上加上偏值。
·borderType:像素外推法选择标志。
示例
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{float points[25] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 };Mat data(5, 5, CV_32FC1, points);//X方向,Y方向和联合滤波器的构建Mat a = (Mat_<float>(3, 1) << -1, 3, -1);Mat b = a.reshape(1, 1);//将3*1的矩阵变为1*3的通道的矩阵Mat ab = a * b;//验证高斯滤波的可分离性Mat gaussX = getGaussianKernel(3, 1); //此函数可自动生成一定尺寸的高斯滤波器,第一个参数是尺寸,第二个参数是标准差Mat gaussData, gaussDataXY;GaussianBlur(data, gaussData, Size(3, 3), 1, 1, BORDER_CONSTANT);sepFilter2D(data, gaussDataXY, -1, gaussX, gaussX, Point(-1, -1), 0, BORDER_CONSTANT);//输入两种高斯滤波的计算结果cout << "gaussData=" << endl << gaussData << endl;cout << "gaussDataXY=" << endl << gaussDataXY << endl;//线性滤波的可分离性Mat dataYX, dataY, dataXY, dataXY_sep;filter2D(data, dataY, -1, a, Point(-1, -1), 0, BORDER_CONSTANT); //进行y方向滤波filter2D(dataY, dataYX, -1, b, Point(-1, -1), 0, BORDER_CONSTANT); //进行x方向滤波filter2D(data,dataXY, -1, ab, Point(-1, -1), 0, BORDER_CONSTANT); //xy联合滤波,此结果应当与前两个操作的结果一致sepFilter2D(data, dataXY_sep, -1, b, b, Point(-1, -1), 0, BORDER_CONSTANT); //使用分离滤波函数进行滤波的结果,若与上面的结果一致,那么可以得到结论:分离滤波函数可以接受两个同尺寸的滤波器//输出分离滤波和联合滤波的计算结果cout << "dataYX=" << endl << dataYX << endl;cout << "dataXY=" << endl << dataXY << endl;cout << "dataXY_sep=" << endl << dataXY_sep << endl;//对于图像的可分离操作Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");if (img.empty()){cout << "请确认图像文件名是否正确" << endl;}Mat imgYX, imgY, imgXY;filter2D(img, imgY, -1, a, Point(-1, -1), 0, BORDER_CONSTANT);filter2D(imgY, imgYX, -1, b, Point(-1, -1), 0, BORDER_CONSTANT);filter2D(img, imgXY, -1, ab, Point(-1, -1), 0, BORDER_CONSTANT);imshow("img", img);imshow("imgY", imgY);imshow("imgYX", imgYX);imshow("imgXY", imgXY);waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出return 0;}
结果


由运行结果可知,对于图像的滤波可以经过线性分离实现,这样可以极大的所见程序运行所需要的数据,我们不需要将两个方向的滤波器乘在一起得到联合滤波器,也缩减了我们的工作量。
相关文章:
opencv#32 可分离滤波
滤波的可分离性 就是将一个线性滤波变成多个线性滤波,这里面具体所指的是变成x方向的线性滤波和y方向的线性滤波。无论先做x方向的滤波还是y方向滤波,两者的叠加结果是一致的,这个性质取决于滤波操作是并行的,也就是每一个图像在滤…...
android 导航app 稳定性问题总结
一 重写全局异常处理: 1 是过滤掉一些已知的无法处理的 问题,比如TimeoutException 这种无法根除只能缓解的问题可以直接catch掉 2 是 一些无法继续的问题可以直接杀死重启,一些影响不是很大的,可以局部还原 比如: p…...
第11次修改了可删除可持久保存的前端html备忘录:将样式分离,可以自由秒添加秒删除样式
第11次修改了可删除可持久保存的前端html备忘录:将样式分离,可以自由秒添加秒删除样式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…...
hcip高级网络知识
一:计算机间信息传递原理 抽象语言----编码 编码---二进制 二进制---转换为电流(数字信号) 处理和传递数字信号 二:OSI--七层参考模型 ISO--1979 规定计算机系统互联的组织: OSI/RM ---- 开放式系统互联参考模型 --- 1…...
常用电子器件学习——MOS管
MOS管介绍 MOS,是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管,简称金氧半场效晶体管(Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET)。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…...
System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候,我遇到一个错误提示,错误信息如下,当我将错误信息仔细阅读了一番,信息提示的很明显,错误出现的来源就是连接数据库代码这块string connStr "s…...
数据库(SQL语句:DMLDQL)
目录 有关数据表的DML操作 1.1 INSERT 语句 1.2 REPLACE 语句 replace语句的语法格式(三种) REPLACE 语句 和 INSERT 语句的区别 1.3 DELETE 语句 | | TRUNCATE 语句 DELETE TRUNCATE DROP 1.4 UPDATE 数据 1.5 SELECT 语句 (DQL数…...
AnimatedDrawings:让绘图动起来
老样子,先上图片和官网。这个项目是让绘制的动画图片动起来,还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹,启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…...
红黑树浅浅学习
红黑树浅浅学习 红黑树概念红黑树平衡性调整 红黑树概念 二叉树:二叉树是每个节点最多有两个子树的树结构。二叉查找树:又称“二叉搜索树”,左孩子比父节点小,右孩子比父节点大,还有一个特性就是”中序遍历“可以让结…...
QGraphicsView 如何让图形大小适配窗口
1. setSceneRect 做什么用? setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。 QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定…...
sqlmap使用教程(3)-探测注入漏洞
1、探测GET参数 以下为探测DVWA靶场low级别的sql注入,以下提交方式为GET,问号(?)将分隔URL和传输的数据,而参数之间以&相连。--auth-credadmin:password --auth-typebasic (DVWA靶场需要登录…...
期待已久!阿里云容器服务 ACK AI 助手正式上线
作者:行疾 大模型技术的蓬勃发展持续引领 AI 出圈潮流,各行各业都在尝试采用 AI 工具实现智能增效。 2023 年云栖大会上,阿里云容器服务团队正式发布 ACK AI 助手,带来大模型增强智能诊断,帮助企业和开发者降低 K8s …...
[BUG] Authentication Error
前言 给服务器安装了一个todesk,但是远程一直就是,点击用户,进入输入密码界面,还没等输入就自动返回了 解决 服务器是无桌面版本,或者桌面程序死掉了,重新安装就好 sudo apt install xorg sudo apt inst…...
23种设计模式概述
学习设计模式对我们有什么帮助? 1.提高代码质量和可维护性:设计模式是经过验证的解决方案,有助于解决常见的设计问题。使用设计模式可以减少代码冗余,增强代码的可读性和可维护性,并提高代码的可靠性。 2.提升开发效率…...
英文阅读-LinkedIn‘s Tips for Highly Effective Code Review
LinkedIn的CR技巧 LinkedIn团队CodeReview经验与方法,原文来自https://thenewstack.io/linkedin-code-review/ 总结 Do I Understand the “Why”? 在提交pr的同时需要描述本次修改的“动机”,有助于提高代码文档质量。 Am I Giving Positive Feedbac…...
性能优化-高通的Hexagon DSP和NPU
原文来自【 Qualcomm’s Hexagon DSP, and now, NPU 】 本文主要介绍Qualcomm Hexagon DSP和NPU,这些为处理简单大量运算而设计的硬件。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能…...
第137期 Oracle的数据生命周期管理(20240123)
数据库管理137期 2024-01-23 第137期 Oracle的数据生命周期管理(20240123)1 ILM2 Heat Map3 ADO4 优点5 对比总结 第137期 Oracle的数据生命周期管理(20240123) 作者:胖头鱼的鱼缸(尹海文) Orac…...
电脑的GPU太强了,pytorch版本跟不上,将cuda驱动进行降级
我的情况: 我买的电脑的GPU版本为rtx4060,但是装上相应的驱动后,cuda的版本为12.3,而现在pytorch中cuda安装命令的最新版本为12.1,所以我将电脑的驱动进行降级为cuda版本为10.1的。 最后成功安装cuda10.1版本的驱动 …...
1 认识微服务
1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构:将业务的所有…...
PHP+SOCKET 服务端多进程处理多客户端请求 demo
服务端 $socket socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_bind($socket,0,95012) or die( server bind fail: . socket_strerror(socket_last_error())); socket_listen($socket,5);$child 0; //初始化子进程数 while(true){$client socket_accept($socket);$pi…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
MyBatis-Plus 常用条件构造方法
1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...
