OpenCV filter2D函数详解

     OpenCV filter2D函数简介   

        OpenCV filter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。

        该函数实际上计算相关性,而不是卷积:

  filter2D函数的原型如下:

        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  输出图像,与 src 大小相同、通道数相同

       ddepth  目标图像的所需深度

        kernel 卷积核(或者更确切地说是相关核),单通道浮点矩阵;如果要将不同的内核应用于                        不同的通道,请使用 split 将图像分割为单独的颜色平面并单独处理它们。

        anchor 内核的锚点,指示内核中过滤点的相对位置;锚应该位于内核内;默认值(-1,-1)                      表示锚点位于内核中心。

        delta  在将过滤像素存储到 dst 之前添加到过滤像素的可选值。

        borderType 像素外推方法。可以选以下几种:BORDER_CONSTANT,BORDER_REPLICATE,BORDER_REFLECT,BORDER_REFLECT_101,BORDER_TRANSPARENT,BORDER_REFLECT101,BORDER_DEFAULT,BORDER_ISOLATED。

        OpenCV filter2D函数应用

        使用OpenCV filter2D函数,通过改变卷积核(kernel)可达成不同的滤波效果。下面就OpenCV filter2D函数的几种常用场景做说明,并以实例做演示。

        图像锐化

        图像锐化使用的卷积核如下:

        Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

        下面以实例演示图像锐化操作及锐化效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);Mat dst;filter2D(src, dst, src.depth(), kernel);imshow("Output Image", dst);waitKey(0);return 0;
}

试运行,结果如下:

        可以看到经过Filter2D滤波后的图像变得更清晰。

均值滤波

        OpenCV filter2D函数实现均值滤波的卷积核如下:

Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;

下面以实例演示filter2D实现图像均值滤波操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{//sharp test/*Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);Mat dst;filter2D(src, dst, src.depth(), kernel);imshow("Output Image", dst);*///Mean filter testMat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 15; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);waitKey(0);return 0;
}

       试运行,结果如下:

 

可以看出,均值滤波可以去除图像椒盐噪声,达到磨皮效果。

 高斯滤波

OpenCV filter2D函数实现高斯滤波的卷积核可由高斯核转换得到,方法如下:

Mat kernelGaussian = getGaussianKernel(9, 1.5);
Mat  kernel = kernelGaussian * kernelGaussian.t();

下面以实例演示filter2D实现图像高斯滤波操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{//filter2d sharp test/*Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);Mat dst;filter2D(src, dst, src.depth(), kernel);imshow("Output Image", dst);*///filter2d Mean filter test/*Mat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 15; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);*///filter2d Gaussian filter testMat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernelGaussian = getGaussianKernel(9, 1.5);Mat  kernel = kernelGaussian * kernelGaussian.t();Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 6; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);waitKey(0);return 0;
}

试运行,结果如下:

可以看出,同样filter2D均高斯滤波同样可以去除图像椒盐噪声,达成磨皮效果,且所需次数更少。

 边缘检测

 filter2D还可以使用sobel内核实现边缘检测,soble内核如下:

Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);
Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);

下面以实例演示filter2D 用sobel核实现图像边缘检测操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{//filter2d sharp test/*Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);Mat dst;filter2D(src, dst, src.depth(), kernel);imshow("Output Image", dst);*///filter2d Mean filter test/*Mat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 15; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);*///filter2d Gaussian filter test/*Mat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernelGaussian = getGaussianKernel(9, 1.5);Mat  kernel = kernelGaussian * kernelGaussian.t();Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 6; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);*///filter2d detect edges testMat src = imread("4.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}threshold(src, src, 127, 255, THRESH_BINARY);imshow("Input Image", src);Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);Mat edges,edgesX, edgesY;filter2D(src, edgesX, CV_16S, sobelX);filter2D(src, edgesY, CV_16S, sobelX);convertScaleAbs(edgesX, edgesX);convertScaleAbs(edgesY, edgesY);addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);imshow("Edges", edges);waitKey(0);return 0;
}

试运行,结果如下:

        可以看出确实检测到了边缘,效果并不是很好。

        filter2D还可以使用Prewitt核,实现边缘检测。Prewitt核如下:

        Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
        Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1,0, 0, 0, 1, 1, 1);

        下面以实例演示filter2D 用Prewitt核实现图像边缘检测操作及滤波效果,示例代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{//filter2d sharp test/*Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);Mat dst;filter2D(src, dst, src.depth(), kernel);imshow("Output Image", dst);*///filter2d Mean filter test/*Mat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1, 1, 1, 1, 1, 1, 1) / 9;Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 15; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);*///filter2d Gaussian filter test/*Mat src = imread("3.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}imshow("Input Image", src);Mat kernelGaussian = getGaussianKernel(9, 1.5);Mat  kernel = kernelGaussian * kernelGaussian.t();Mat dst;filter2D(src, dst, src.depth(), kernel);for (size_t i = 0; i < 6; i++){filter2D(dst, dst, src.depth(), kernel);}imshow("Output Image", dst);*///filter2d detect edges test/*//sobel kernelMat src = imread("4.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}threshold(src, src, 127, 255, THRESH_BINARY);imshow("Input Image", src);Mat sobelX = (Mat_<float>(3, 3) << -1, 0, 1,-2, 0, 2,-1, 0, 1);Mat sobelY = (Mat_<float>(3, 3) << -1, -2, -1,0, 0, 0,1, 2, 1);Mat edges,edgesX, edgesY;filter2D(src, edgesX, CV_16S, sobelX);filter2D(src, edgesY, CV_16S, sobelX);convertScaleAbs(edgesX, edgesX);convertScaleAbs(edgesY, edgesY);addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);imshow("Edges", edges);*///Prewitt kernelMat src = imread("4.png");if (src.empty()){cout << "Cann't open Image" << endl;return -1;}threshold(src, src, 127, 255, THRESH_BINARY);imshow("Input Image", src);Mat prewitt_x = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);Mat prewitt_y = (Mat_<int>(3, 3) << -1, -1, -1,0, 0, 0, 1, 1, 1);Mat edges, edgesX, edgesY;filter2D(src, edgesX, src.depth(), prewitt_x);filter2D(src, edgesY, src.depth(), prewitt_y);addWeighted(edgesX, 0.5, edgesY, 0.5, 0, edges);imshow("Edges", edges);waitKey(0);return 0;
}

试运行,结果如下:

        从结果可以看出,filter2D使用Prewitt核检测边缘的结果,与使用sobel核边缘检测的结果是有差异的。

      OpenCV  filter2D函数就介绍到这里。博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://mp.csdn.net/mp_blog/creation/editor/136590730

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

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

相关文章

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

基于遗传算法GA的机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

一、原理介绍 遗传算法是一种基于生物进化原理的优化算法&#xff0c;常用于求解复杂问题。在机器人栅格地图最短路径规划中&#xff0c;遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤&#xff1a; 1. 初始化种群&#xff1a;随机生成一组初始解&…

分布式执行引擎ray入门--(2)Ray Data

目录 一、overview 基础代码 核心API&#xff1a; 二、核心概念 2.1 加载数据 从S3上读 从本地读&#xff1a; 其他读取方式 读取分布式数据&#xff08;spark&#xff09; 从ML libraries 库中读取&#xff08;不支持并行读取&#xff09; 从sql中读取 2.2 变换数据…

Pandas DataFrame 写入 Excel 的三种场景及方法

一、引言 本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中&#xff0c;涉及三个不同的应用场景&#xff1a; 单个工作表写入&#xff1a;将单个 DataFrame 写入 Excel 表中&#xff1b;多个工作表写入&#xff1a;将多个 DataFrame 写入到同一个 Excel 表中的…

Spring boot2.7整合jetcache 本地linkedhashmap缓存方案

好 上文 Spring boot2.7整合jetcache 远程redis缓存方案 我们讲完了 远程实现方案 本文 我们来说说 本地 jetcache解决方案 首先是 application.yml 在jetcache下加上 local:default:type: linkedhashmapkeyConvertor: fastjson我们技术用的 本地缓存 linkedhashmap 这里 我们…

【大厂AI课学习笔记NO.69】使用开源管理仓库

了解了开源框架&#xff0c;开源项目&#xff0c;今天来学习开源管理仓库。 我们先说Git&#xff0c;开源的版本管理分布式系统。 GitHub&#xff0c;则是世界上最大的代码托管平台&#xff0c;面向开源和私有项目托管。 有的人总是分不清这两个&#xff0c;其实一个是版本管…

批量提取PDF指定区域内容到 Excel 以及根据PDF里面第一页的标题来批量重命名-附思路和代码实现

首先说明下&#xff0c;PDF需要是电子版本的&#xff0c;不能是图片或者无法选中的那种。 需求1&#xff1a;假如我有一批数量比较多的同样格式的PDF电子文档&#xff0c;需要把特定多个区域的数字或者文字提取出来 需求2&#xff1a;我有一批PDF文档&#xff0c;但是文件的名…

【C语言】——详解操作符(下)

【C语言】——详解操作符&#xff08;下&#xff09; 前言七、关系操作符八、逻辑操作符8.1、& 与运算符8.2、 | 或运算符 九、条件操作符十、逗号表达式十一、下标引用与函数调用操作符11.1、[ ] 下标引用操作符11.2、( ) 函数调用操作符 十二、 结构成员操作符12.1、…

新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码,附带系统搭建教程

支持对接第三方支付 安装方法以linux为例 1、建议在服务器上面安装宝塔面板&#xff0c;以便操作&#xff0c;高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录&#xff0c;同时建立数据库&#xff0c;把数据文件导入数据库 3、修改核心文件config/inc_config.…

“ReferenceError: AMap is not defined“

问题 笔者进行web开发&#xff0c;引入高德地图&#xff0c;控制台报错 "ReferenceError: AMap is not defined"详细问题 vue.runtime.esm.js:4662 [Vue warn]: Error in mounted hook: "ReferenceError: AMap is not defined"found in---> <Map&…

React-嵌套路由

1.概念 说明&#xff1a;在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由&#xff0c;嵌套至一级路由内的路由又称作二级路由。 2.实现步骤 说明&#xff1a;使用childen属性配置路由嵌套关系&#xff0c;使用<Outlet/>组件配置二级路由渲染的位置。…

吴恩达机器学习-可选实验室:逻辑回归,决策边界(Logistic Regression,Decision Boundary))

文章目录 目标数据集图数据逻辑回归模型复习逻辑回归和决策边界绘图决策边界恭喜 目标 在本实验中&#xff0c;你将:绘制逻辑回归模型的决策边界。这会让你更好地理解模型的预测。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_co…

Redis核心数据结构之整数集合

整数集合 概述 整数集合(intset)是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个结合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层实现。 例子 举个例子&#xff0c;如果创建一个只包含五个元素的集合键&#x…

MySQL 8.0 架构 之 慢查询日志(Slow query log)(2)流程图:查询记录到慢查询日志中的条件

文章目录 MySQL 8.0 架构 之 慢查询日志&#xff08;Slow query log&#xff09;&#xff08;2&#xff09;流程图&#xff1a;查询记录到慢查询日志中的条件确定查询是否会记录在慢查询日志中的流程图参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何…

JavaScript数组方法常用方法大全

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. push()2. pop()3. unshift()4. shift()5. isArray()6. map()7. filter()8. every()9. some()10. splice()11. slice()12. indexOf()13. includes()14. concat()1…

【大厂AI课学习笔记NO.76】人工智能人才金字塔

人工智能领域&#xff0c;分为源头创新人才、产业研发人才、应用开发人才和实用技能人才。 人工智能领域的人才结构呈现多样化特点&#xff0c;主要可以分为源头创新人才、产业研发人才、应用开发人才和实用技能人才四大类。这四大类人才在人工智能领域的发展中各自扮演着不可或…

Python刘诗诗

写在前面 刘诗诗在电视剧《一念关山》中饰演了女主角任如意&#xff0c;这是一个极具魅力的女性角色&#xff0c;她既是一位有着高超武艺和智慧的女侠士&#xff0c;也曾经是安国朱衣卫前左使&#xff0c;身怀绝技且性格坚韧不屈。剧中&#xff0c;任如意因不满于朱衣卫的暴行…

P1948 [USACO08JAN] Telephone Lines S

Here 典中之典&#xff01;&#xff01; 解题思路 可选k条边代价为0如何决策&#xff1f; 将到当前位置选择了几条代价为0的边放入状态&#xff0c;即若当前状态选的边数小于&#xff0c;则可以进行决策&#xff0c;是否选择当前边&#xff0c;若选&#xff0c;则&#xff0c…

基于智慧灯杆的智慧城市解决方案(2)

功能规划 智慧照明功能 智慧路灯的基本功能仍然是道路照明, 因此对照明功能的智慧化提升是最基本的一项要求。 对道路照明管理进行智慧化提升, 实施智慧照明, 必然将成为智慧城市中道路照明发展的主要方向之一。 智慧照明是集计算机网络技术、 通信技术、 控制技术、 数据…

uniapp:小程序数字键盘功能样式实现

代码如下&#xff1a; <template><view><view><view class"money-input"><view class"input-container" click"toggleBox"><view class"input-wrapper"><view class"input-iconone"…