11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录

一、卷积

1、卷积概念

2、卷积如何工作

3、常见算子(卷积核 Kenel)

4、自定义卷积模糊

5、代码演示

二、卷积边缘

1、卷积边缘问题

2、处理边缘

3、相关的API说明

4、代码演示


一、卷积

1、卷积概念

(1)在OpenCV中,卷积是一种常用的图像处理操作,用于图像滤波、特征提取等任务。它基于滑动窗口的概念,通过将一个小的核Kenel(也称为滤波器)与图像进行逐像素的乘法和求和运算来实现。

— 卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作。

— Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor point)

(2)卷积操作可以理解为在图像上滑动一个小的核,并将核的每个元素与对应位置的图像像素值相乘,然后将所有乘积结果相加得到输出图像的对应像素值。这个过程可以简单地表示为:

output(x, y) = sum(kernel(i, j) * input(x+i, y+j))

其中,output(x, y)是输出图像的像素值,kernel(i, j)是核的元素值,input(x+i, y+j)是输入图像的像素值。

(3)卷积操作在图像处理中有多种应用,其中最常见的是图像滤波。通过选择不同的核,可以实现不同的滤波效果,例如平滑滤波、边缘检测等。卷积操作还可以用于图像特征提取,例如使用卷积神经网络(CNN)进行图像分类、目标检测等任务。

在OpenCV中,可以使用cv::filter2D函数来进行卷积操作。该函数接受输入图像、核以及输出图像作为参数,并将卷积结果存储在输出图像中。

2、卷积如何工作

把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。数学表达如下

公式讲解:

K(i,j):卷积核的大小

I里面的参数就是窗口的半径

两个方向X、Y方向上的求和

例子:从左到右,从上到下进行计算

Sum = 8x1+6x1+6x1+2x1+8x1+6x1+2x1+2x1+8x1

New pixel = sum / (m*n)

3、常见算子(卷积核 Kenel)

(1)Robert算子:又称“梯度算子”

(2)Sobel算子:中间2*2,更大,比Robert算子的差异更大,效果可能更明显了

(3)拉普拉斯算子

4、自定义卷积模糊

(1)filter2D方法

filter2D (

Mat src, //输入图像

Mat dst, // 模糊图像

int depth, // 图像深度32/8,不知道的就默认-1,系统也默认和src的深度一样

Mat kernel, // 卷积核/模板

Point anchor = Point(-1,-1) , // 锚点位置,3、5、7、9,或者默认自动寻找中心位置

double delta = 0 // 计算出来的像素+delta

其中 kernel是可以自定义的卷积核

5、代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>using namespace cv;
int main(int argc, char** argv)
{Mat src, dst;int ksize = 0;src = imread("test.jpg");if (!src.data){printf("could not load image...\n");return -1;}char INPUT_WIN[] = "input image";char OUTPUT_WIN[] = "Custom Blur Filter Result";namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);imshow(INPUT_WIN, src);// Robert 算子 X 方向//Mat Robert_x = (Mat_<int>(2, 2) << 1, 0, 0, -1);//Mat mat_Robert_x;//filter2D(src, mat_Robert_x, -1, Robert_x);//imshow("Robert x", mat_Robert_x);Robert 算子 Y 方向//Mat Robert_y = (Mat_<int>(2, 2) << 0, 1, -1, 0);//Mat mat_Robert_y;//filter2D(src, mat_Robert_y, -1, Robert_y);//imshow("Robert y", mat_Robert_y);// Sobel X 方向Mat kernel_x = (Mat_<int>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);filter2D(src, dst, -1, kernel_x, Point(-1, -1), 0.0);imshow("Sobel X", dst);// Sobel Y 方向Mat yimg;Mat kernel_y = (Mat_<int>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);filter2D(src, yimg, -1, kernel_y, Point(-1, -1), 0.0);imshow("Sobel Y", yimg);// 拉普拉斯算子//Mat kernel_y = (Mat_<int>(3, 3) << 0, -1, 0, -1, 4, -1, 0, -1, 0);//filter2D(src, dst, -1, kernel_y, Point(-1, -1), 0.0);//imshow("拉普拉斯", dst);waitKey(0);// 自定义卷积模糊//int c = 0;//int index = 0;//while (true)null//{//	c = waitKey(500);//	if ((char)c == 27) // ESC//	{ //		break;//	}//	ksize = 5 + (index % 8) * 2;//	Mat kernel = Mat::ones(Size(ksize, ksize), CV_32F) / (float)(ksize * ksize);//	filter2D(src, dst, -1, kernel, Point(-1, -1));//	index++;//	imshow(OUTPUT_WIN, dst);//}return 0;
}

效果展示:

(1)Robert算子,在X与Y方向上呈现出差异性

(2)Sobel算子:相对与Robert算子,差异会明显一些

(3)拉普拉斯算子:碎发也没看到了

二、卷积边缘

1、卷积边缘问题

卷积边缘问题:图像卷积的时候边界像素,不能被卷积操作。

原因:在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。

2、处理边缘

在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在 四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之 后再去掉这些边缘。

openCV中默认的处理方法是: BORDER_DEFAULT,此外 常用的还有如下几种:

- BORDER_CONSTANT – 填充边缘用指定像素值  

- BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值

- BORDER_WRAP – 用另外一边的像素来补偿填充

3、相关的API说明

给图像添加边缘API:copyMakeBorder

copyMakeBorder(  

- Mat src, // 输入图像  

- Mat dst, // 添加边缘图像  

- int top, // 边缘长度,一般上下左右都取相同值,

 - int bottom,  

- int left,  

- int right,  

- int borderType // 边缘类型  

- Scalar value

4、代码演示

增加边缘的四种策略,都适用于什么场景,如何处理卷积的边缘。

先认识下:GaussianBlur()

GaussianBlur函数用于对图像进行高斯模糊操作。它可以有效地去除图像中的噪声,并平滑图像的细节。

void GaussianBlur (

InputArray src, // 输入图像,可以是单通道或多通道图像

OutputArray dst, // 输出图像,与输入图像具有相同的尺寸和类型

Size ksize, // 高斯核的大小,用Size(w, h)表示。它必须是正奇数,例如(3, 3)、(5, 5)等。

double sigmaX, // 高斯核在X方向上的标准差

double sigmaY = 0, // 高斯核在Y方向上的标准差。如果为0,则默认使用sigmaX的值

int borderType = BORDER_DEFAULT // 边界处理方式,默认为BORDER_DEFAULT

);

int main(int argc, char** argv) 
{Mat src, dst;src = imread("test.jpg");if (!src.data) {printf("could not load image...\n");return -1;}char INPUT_WIN[] = "input image";char OUTPUT_WIN[] = "Border Demo";namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);imshow(INPUT_WIN, src);/*int top = (int)(0.05*src.rows);int bottom = (int)(0.05*src.rows);int left = (int)(0.05*src.cols);int right = (int)(0.05*src.cols);RNG rng(12345);int borderType = BORDER_DEFAULT;int c = 0;while (true) {c = waitKey(500);// ESCif ((char)c == 27) break;if ((char)c == 'r') borderType = BORDER_REPLICATE;else if((char)c == 'w') borderType = BORDER_WRAP;else if((char)c == 'c') borderType = BORDER_CONSTANT;Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));copyMakeBorder(src, dst, top, bottom, left, right, borderType, color);imshow(OUTPUT_WIN, dst);}*/// 上面的代码可以直接用下面接口替换GaussianBlur(src, dst, Size(5, 5), 0, 0);imshow(OUTPUT_WIN, dst);waitKey(0);return 0;
}

效果展示:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MySQL]基础的增删改查

目录 1.前置介绍 2.数据库操作 2.1显示当前数据库 2.2创建数据库 2.3 使用数据库 2.4 删除数据库 3.常用数据类型 3.1整型和浮点型 3.2字符串类型 4.表的操作 4.1查看表结构 4.2创建表 4.3删除表 5.重点 5.1操作数据库 5.2常用数据类型 5.3操作表 1.前置介绍 …

课题学习(十九)----Allan方差:陀螺仪噪声分析

一、介绍 Allan方差是一种分析时域数据序列的方法&#xff0c;用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解&#xff0c;是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用…

双指针算法专题

前言 双指针算法入门&#xff0c;干就完了 下面的题目都是来自灵神的基础算法精讲&#xff0c;有思路不清晰的地方&#xff0c;可以去看讲解。 灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com) 相向双指针 1.两数之和 题目链接&#xff1a;167. 两数之…

VSCode使用Makefile Tools插件开发C/C++程序

提起Makefile&#xff0c;可能有人会觉得它已经过时了&#xff0c;毕竟现在有比它更好的工具&#xff0c;比如CMake&#xff0c;XMake&#xff0c;Meson等等&#xff0c;但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的&#xff0c;可以说Makefile是基石…

YARN节点故障的容错方案

YARN节点故障的容错方案 1. RM高可用1.1 选主和HA切换逻辑 2. NM高可用2.1 感知NM节点异常2.2 异常NM上的任务处理 4. 疑问和思考4,1 RM感知NM异常需要10min&#xff0c;对于app来说是否太长了&#xff1f; 5. 参考文档 本文主要探讨yarn集群的高可用容错方案和容错能力的探讨。…

查找局域网树莓派raspberry的mac地址和ip

依赖python库&#xff1a; pip install socket pip install scapy运行代码&#xff1a; import socket from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名ret…

【C++】类和对象(上篇)

文章目录 &#x1f6df;一、面向过程和面向对象初步认识&#x1f6df;二、类的引入&#x1f6df;三、类的定义&#x1f4dd;1、类的两种定义方式&#x1f4dd;2、成员变量命名规则的建议 &#x1f6df;四、类的访问限定符及封装&#x1f369;1、访问限定符&#x1f369;2、封装…

医院网络安全建设:三网整体设计和云数据中心架构设计

医院网络安全问题涉及到医院日常管理多个方面&#xff0c;一旦医院信息管理系统在正常运行过程中受到外部恶意攻击&#xff0c;或者出现意外中断等情况&#xff0c;都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等&#xff0c;…

unity 单例模式(实例详解)

文章目录 在Unity中&#xff0c;单例模式是一种常用的编程设计模式&#xff0c;用于确保在整个应用程序生命周期中&#xff0c;只有一个类的实例存在。这样可以保证数据的全局唯一性和共享性&#xff0c;例如游戏场景中的资源管理器、游戏控制器、事件管理器等。 以下是一个简单…

C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景

一、call_once 单例模式 Singleton 大家可以先看这篇文章&#xff1a;https://zh.cppreference.com/w/cpp/thread/call_once /*std::call_oncevoid call_once( std::once_flag& flag, Callable&& f, Args&&... args ); */ #include <iostream> #i…

C# 使用System.Threading.Timer 实现计时器

写在前面 以往一般都是用 System.Timers.Timer 来做计时器&#xff0c;而 System.Threading.Timer 也可以实现计时器功能&#xff0c;并且还可以配置首次执行间隔&#xff0c;在功能上比System.Timers.Timer更加丰富&#xff1b;根据这个特性就可以实现按指定时间间隔对委托进…

2023年上半年网络工程师真题(1/3)

1.固态硬盘的存储介质是&#xff08;B&#xff09;。 A.光盘 B.闪存 C.软盘 D.磁盘 SSD存储介质是FLASH(一块块的存储芯片)&#xff0c;HDD(机械硬盘)存储介质是磁盘(机械臂和盘道)&#xff0c;补充:U盘的存储介质也是FLASH闪存。 2.虚拟存储技术把&#xff08;A&#xf…

小封装高稳定性振荡器 Sg2520egn / sg2520vgn, sg2520ehn / sg2520vhn

描述 随着物联网和ADAS等5G应用的实施&#xff0c;数据流量不断增长&#xff0c;网络基础设施变得比以往任何时候都更加重要。IT供应商一直在快速建设数据中心&#xff0c;并且对安装在数据中心内部/内部的光模块有很大的需求。此应用需要具有“小”&#xff0c;“低抖动”和“…

Linux_清理docker磁盘占用

文章目录 前言一、docker system 命令1. docker system df&#xff08;本文重点使用&#xff09;2. docker system prune&#xff08;本文重点使用&#xff09;3. docker system info4. docker system events 二、开始清理三、单独清理Build Cache四、单独清理未被使用的网络 前…

特征融合篇 | YOLOv8 引入长颈特征融合网络 Giraffe FPN

在本报告中,我们介绍了一种名为DAMO-YOLO的快速而准确的目标检测方法,其性能优于现有的YOLO系列。DAMO-YOLO是在YOLO的基础上通过引入一些新技术而扩展的,这些技术包括神经架构搜索(NAS)、高效的重参数化广义FPN(RepGFPN)、带有AlignedOTA标签分配的轻量级头部以及蒸馏增…

一文详解 Berachain 测试网:全面介绍与教程,bitget wallet教程

什么是Berachain&#xff1f; Berachain&#xff08;web3.bitget.com/zh-CN/assets/berachain-wallet&#xff09;是一种尖端区块链技术&#xff0c;使用 Cosmos SDK 构建的 Layer-1&#xff0c;兼容以太坊虚拟机&#xff08;EVM&#xff09;。它基于一种独特的概念&#xff0c…

Unity编程#region..#endregion以及面板提示语标签[Tooltip(““)]

C#中的#region..#endregion 在Unity中&#xff0c;#region和#endregion是用于代码折叠的预处理指令。它们并不是Unity特有的&#xff0c;而是C#语言本身提供的功能。 #region用于标记一段代码的开始&#xff0c;而#endregion用于标记一段代码的结束。在编辑器中&#xff0c;可…

基于YOLOv5、v7、v8的竹签计数系统的设计与实现

文章目录 前言效果演示一、实现思路① 算法原理② 程序流程图 二、系统设计与实现三、模型评估与优化① Yolov5② Yolov7③Yolov8 四、模型对比 前言 该系统是一个综合型的应用&#xff0c;基于PyTorch框架的YOLOv5、YOLOv7和YOLOv8&#xff0c;结合了Django后端和Vue3前端&am…

C内存对齐问题

一、主要参考&#xff1a; C/C编程笔记&#xff1a;C语言对齐问题【结构体、栈内存以及位域对齐】_二进制异常退出,栈对齐-CSDN博客 其中关于内存对齐&#xff0c;讲了结构体以及位域&#xff0c;以及一些容易出错的地方&#xff0c;非常好。 结构体对齐&#xff1a; 下面提…

项目风险管理

风险分类&#xff1a; 分类性质&#xff1a;纯粹风险&#xff0c;投机风险---对应火灾&#xff0c;股票买卖 产生原因&#xff1a;自然&#xff0c;社会&#xff0c;政治&#xff0c;经济&#xff0c;技术 风险性质&#xff1a;客观性&#xff0c;偶然性&#xff0c;相对性&a…