当前位置: 首页 > news >正文

OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::filter2D() 函数用于对图像应用二维卷积滤波器。这个函数可以用来实现多种图像处理操作,如模糊、锐化、边缘检测等。它通过将一个二维核(也称为滤波器或掩模)与图像中的每个像素进行卷积来工作。

函数与核进行卷积操作。
此函数将任意线性滤波器应用于图像。支持原地操作。当核的部分超出图像范围时,函数会根据指定的边界模式插值处理边界外的像素值。
此函数实际上计算的是相关运算,而非卷积:
dst ( x , y ) = ∑ 0 ≤ x ′ < kernel.cols 0 ≤ y ′ < kernel.rows kernel ( x ′ , y ′ ) ∗ src ( x + x ′ − anchor.x , y + y ′ − anchor.y ) \texttt{dst} (x,y) = \sum _{ \substack{0\leq x' < \texttt{kernel.cols}\\{0\leq y' < \texttt{kernel.rows}}}} \texttt{kernel} (x',y')* \texttt{src} (x+x'- \texttt{anchor.x} ,y+y'- \texttt{anchor.y} ) dst(x,y)=0x<kernel.cols0y<kernel.rowskernel(x,y)src(x+xanchor.x,y+yanchor.y)

函数原型

void cv::filter2D	
(InputArray 	src,OutputArray 	dst,int 	ddepth,InputArray 	kernel,Point 	anchor = Point(-1,-1),double 	delta = 0,int 	borderType = BORDER_DEFAULT 
)		

参数

  • 参数 src 输入图像.
  • 参数dst 输出图像,与输入图像具有相同的尺寸和通道数量。
  • 参数ddepth 目标图像期望的深度,参见 combinations
  • 参数kernel卷积核(或更确切地说是相关核),单通道浮点矩阵;如果您想对不同通道应用不同的核,可以使用 split 函数将图像分割成单独的颜色平面并分别处理它们。
  • 参数anchor 核的锚点,指示过滤点在核内的相对位置;锚点应位于核内;默认值 (-1, -1) 表示锚点位于核的中心。
  • 参数delta 可选值,在将过滤后的像素存储到 dst 之前添加到这些像素上。
  • 参数borderType 像素外推方法,参见 BorderTypes。BORDER_WRAP 不受支持。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>int main( int argc, char** argv )
{// 加载图像cv::Mat src = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_COLOR );if ( !src.data ){std::cerr << "错误: 无法打开或找到图像。" << std::endl;return -1;}cv::Size sz2Sh( 400, 600 );cv::resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );// 创建输出图像cv::Mat dst;cv::Mat kernelGaussian = cv::getGaussianKernel( 9, 2.5 );cv::Mat kernel         = kernelGaussian * kernelGaussian.t();for ( int i = 0; i < 4; i++ ){filter2D( src, dst, src.depth(), kernel );}// 显示图像cv::namedWindow( "原始图像", cv::WINDOW_NORMAL );cv::imshow( "原始图像", src );cv::namedWindow( "平滑处理后的图像", cv::WINDOW_NORMAL );cv::imshow( "平滑处理后的图像", dst );cv::waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

你可以修改getGaussianKernel的参数和filter2D的执行次数,看看图像有什么变化

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • final finally finalize 区别?
  • 【多线程基础】指令、进程调度、了解计算机是如何进行工作的
  • TDengine Cloud 助力智源未来,引领能源管理革新
  • 服务器CPU架构有几种?分别应用到什么场景?有啥优缺点?
  • eBPF编程指南(一):eBPF初体验
  • 【网络】协议,OSI参考模型,局域网通信,跨网络通信
  • FFmpeg推流
  • 代码随想录算法训练营Day36||Leetcode1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零
  • 【libevent多线程服务器】--UDP
  • 设计模式 - 适配器模式
  • PyCharm找不到Python了咋办
  • Pinterest:从 Druid 到 StarRocks,实现 6 倍成本效益比提升
  • Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)
  • win系统运行命令行常用命令汇总
  • LVS(Linux Virtual Server)详解
  • ES6 ...操作符
  • Javascript设计模式学习之Observer(观察者)模式
  • python_bomb----数据类型总结
  • React-生命周期杂记
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring框架之我见(三)——IOC、AOP
  • Theano - 导数
  • 如何用vue打造一个移动端音乐播放器
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 一些css基础学习笔记
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Nginx实现动静分离
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (7)摄像机和云台
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • *p++,*(p++),*++p,(*p)++区别?
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .htaccess 强制https 单独排除某个目录
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .Net 代码性能 - (1)
  • .net反混淆脱壳工具de4dot的使用
  • @EventListener注解使用说明
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Android 13]Input系列--获取触摸窗口
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [ARM]ldr 和 adr 伪指令的区别
  • [AX]AX2012 SSRS报表Drill through action
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子