opencv 的norm_22、OpenCV用卷积Filter2D进行滤波器

迄今为止,看到的函数中,卷积的操作发生在OpenCV函数的内部。理论上,图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看,它需要一个数组参数来描述内核。在实践层面,有一个重要的微妙因素会对结果产生重大影响。微妙之处在于一些内核是可分离的,而另一些则不是。

ecb9f29badbac2207b9af8bb9a24c170.png
图1

图1(A)是可分离的; 它可以表示为两个一维卷积(B和C);D是一个不可分割内核的例子。可分离的内核是可以被认为是两个一维内核的内核,首先与x内核进行卷积然后与y内核进行卷积来应用。这种分解的好处是内核卷积的计算成本大约是图像面积乘以内核区域。这意味着用n×n内核卷积区域A的图像需要时间与An2成正比,同时n×1内核与图像卷积一次,然后与1×n内核卷积占用与An + An = 2An成比例。即使n小于3也有好处,随着n的增长,优势更为突出。

1、 利用filter2D()滤波

鉴于图像卷积所需的操作次数,是图像中像素的数量乘以内核中的像素数,这可能需要很多计算,因此,在这种情况下,最好让OpenCV来帮你完成并利用内部优化。OpenCV完成这些操作的函数是filter2D():

cv::filter2D(

cv::InputArray src,

cv::OutputArray dst,

int ddepth,

cv::InputArray kernel,

cv::Point anchor = cv::Point(-1,-1),

double delta = 0,

int borderType = cv::BORDER_DEFAULT

);

创建一个适当大小的数组,并用滤波器的系数填充它,然后将它与源图像和目标图像一起传递到filter2D()中。可以使用ddepth指定结果图像的深度,使用锚点指定滤波的锚点,使用borderType指定边界类型。如果定义了锚点,则内核可以是偶数大小;否则,它应该是奇数大小。如果要在应用滤波器后将总体偏移应用于结果,则可以使用参数delta。

2、 利用sepFilter2D分离滤波器

在内核可分离的情况下,通过以分离的形式表示并将这些一维内核传递给OpenCV,将从OpenCV获得最佳性能。sepFilter2D()与filter2D()类似,除了它期望这两个一维内核而不是一个二维内核。

cv::sepFilter2D(

cv::InputArray src,

cv::OutputArray dst,

int ddepth,

cv::InputArray rowKernel,

cv::InputArray columnKernel,

cv::Point anchor = cv::Point(-1,-1),

double delta = 0,

int borderType = cv::BORDER_DEFAULT

);

sepFilter2D()的所有参数都与cv :: filter2D()的参数相同,但使用rowKernel和columnKernel参数替换内核参数除外。后者为n1×1和1×n2阵列,n1不一定等于n2。

3、构建内核

getDerivKernel()构造Sobel和Scharr内核,getGaussianKernel()构造高斯内核。

void cv::getDerivKernels(

cv::OutputArray kx,

cv::OutputArray ky,

int dx,

int dy,

int ksize,

bool normalize = true,

int ktype = CV_32F

);

getDerivKernel()的结果放置在kx和ky参数中。内核(Sobel和Scharr)是可分离的内核,将返回两个数组,一个是1×ksize(行系数,kx),另一个是ksize×1(列系数,ky)。这些是从x和y导数阶dx和dy计算而来的。衍生内核总是方形的,因此大小参数ksize是一个整数。ksize可以是1,3,5,7或cv ::SCHARR中的任何一个。normalize参数告诉getDerivKernels()是否应该对内核元素进行归一化。对于在浮点图像上操作的情况,将normalize设置为true,但是当正在操作整数数组时,通常更为明智的做法是,在一些数组之前不对数组进行归一化,这样就不会丢掉以后需要的精度。最后一个参数ktype表示滤波器系数的类型。 ktype的值可以是CV_32F或CV_64F。

高斯滤波器的实际内核数组由getGaussianKernel()生成。

cv::Mat cv::getGaussianKernel(

int ksize, // Kernel size

double sigma, // Gaussian half-width

int ktype = CV_32F // Type for filter coefficients

);

与派生内核一样,高斯内核是可分离的。因此,getGaussianKernel()只计算一个ksize×1的系数数组。ksize的值可以是任何奇数正数。参数sigma设置近似高斯分布的标准偏差。根据以下函数从sigma计算系数:

fb5803713282c62b34ec23ce62fc7b26.png

也就是说,计算系数α使得滤波器整体被归一化。可以将其设置为-1,在这种情况下,将根据ksize大小自动计算σ值。在这种情况下,

93fb0ad12619dac946aefa8e6fa12b00.png

例1是具体的使用方法,从中能看出构造的每个卷积核的用途吗?

例1:filter2D、sepFilter2D、getDerivKernels、getGaussianKernel功能演示。

#include <iostream>
#include <opencv2opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{Mat src = imread("E:/ img.bmp", 1);namedWindow("原始噪声图像", 0);imshow("原始噪声图像", src);//构造滤波器Mat kernal = Mat::ones(3, 3, CV_32FC1);kernal/= 9;Mat filterDst;filter2D(src, filterDst, src.depth(), kernal);namedWindow("filter2D结果1", 0);imshow("filter2D结果1", filterDst);Mat kernal2 = (Mat_<char>(3, 3) << 0, -1, 0,-1, 5, -1,0, -1, 0);Mat dst1;filter2D(filterDst, dst1, src.depth(), kernal2);namedWindow("filter2D结果2", 0);imshow("filter2D结果2", dst1);Mat kx = (Mat_<float>(1, 3) << 0, -1, 0);Mat ky = (Mat_<float>(1, 3) << -1, 0, -1);sepFilter2D(filterDst, dst1, src.depth(), kx, ky);// , Point(-1, -1), 0, BORDER_DEFAULT);namedWindow("sepFilter2D结果", 0);imshow("sepFilter2D结果", dst1);getDerivKernels(kx, ky, 1, 1, 3, true);cout << kx << endl;cout << ky << endl;Mat dst2;sepFilter2D(filterDst, dst2, src.depth(), kx, ky);// , Point(-1, -1), 0, BORDER_DEFAULT);cv::normalize(dst2, dst2, 0, 255, NORM_MINMAX, CV_8UC1);namedWindow("sepFilter2D结果2", 0);imshow("sepFilter2D结果2", dst2);Mat gaussKernal;gaussKernal = getGaussianKernel(7, -1);filter2D(src, filterDst, src.depth(), gaussKernal);namedWindow("Filter2D结果3", 0);imshow("Filter2D结果3", filterDst);waitKey(0);return 0;
}

80b175405c1ee28a155e4e17082665f5.png
图2 操作结果示意图

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

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

相关文章

初学python有几个阶段_零基础如何系统的学习Python 从7个阶段入手

目前信息化产业发展势头很好&#xff0c;互联网就成为了很多普通人想要涉及的行业&#xff0c;因为相比于传统行业&#xff0c;互联网行业涨薪幅度大&#xff0c;机会也多&#xff0c;所以就会大批的人想要转行来学习Python开发。Python语言的应用Python是它们的主流语言&#…

glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图

我们经常看到的Bar Chart Race&#xff08;柱形竞赛图&#xff09;&#xff0c;可以看到数据的呈现非常的直观。今天就一起来学习下如何生成和上面一样的柱形竞赛图。1、导入Python库2、加载数据集这里使用的是城市人口数据集&#xff0c;加载我们想要的数据&#xff1a;其中&a…

python做后端开发的优点_【后端开发】python语言的特点是什么

python语言的特点是什么&#xff1f;python语言的特点简单Python是一门简单而文字简约的语言。阅读好的Python程序感觉就像阅读英语&#xff0c;尽管是非常严格的英语。Python的这种伪代码特性是其最大强项之一&#xff0c;它可让你专注于解决问题的办法而不是语言本身。容易学…

rust队友开挂_腐蚀RUST开挂玩家识别方法 如何识别玩家开挂

远程查挂是最无奈的选择&#xff0c;也是最后的办法&#xff0c;遇到一些会隐藏的你也查不到。附体附体附体!!这是唯一的方法!!附体是最好的选择&#xff0c;当然gm必须有丰富的游戏经验&#xff0c;800小时以下的玩家不适合做gm(除非有老师傅带)。下面说说如何对付只开透视的老…

不冲突的端口范围_网络中IP地址发生冲突故障怎么办

——————欢迎新老朋友们加入微信群,方便技术讨论&#xff0c;信息互通&#xff0c;行业交流&#xff1a;智能弱电行业专家群&#xff1b;智能弱电行业技术群&#xff1b;智能弱电行业信息群&#xff1b;申请加入请加小编微信&#xff1a;15537112161———————有朋友提…

项目结构_组织结构对项目影响系列课程---项目式组织结构

在前面的几篇文章中我们分别介绍了&#xff0c;系统型&#xff08;简单型&#xff09;&#xff0c;职能型&#xff0c;弱矩阵&#xff0c;平衡矩阵&#xff0c;强矩阵结构的优点和缺点及它们带给项目的影响。今天我们介绍项目式组织结构的优点和缺点及其可能产生的影响。从结构…

第三范式的作用_钟启泉:教学范式的转型,让一线教师面临三大挑战 | 头条

培育“核心素养”的方法论——能动学习真实性的学习境脉所谓“能动学习”是“基于学习者的主体性参与与学习者之间能动的交互作用的学习而产生的”。它不是单纯记忆知识的学习&#xff0c;而是指学习者能够活跃地应对种种课题&#xff0c;并富有实感支撑的学习。基于“核心素养…

云服务器 管理控制台_关于小白如何初步管理自己的云服务器

博主在刚刚接触云服务器的时候&#xff0c;买的云服务是Linux系统的&#xff0c;反正是一脸懵&#xff0c;后来找了很多资料。所以博主认为步骤主要为以下几步第一步&#xff1a;如果买的是Linux系统将其重装成windows系统。以腾讯云服务器为例1.点击右上角的控制台2.进入买的云…

leetcode 贪心_利用贪心算法解LeetCode第1253题:重构2行二进制矩阵

题目描述给你一个 2 行 n 列的二进制数组&#xff1a;矩阵是一个二进制矩阵&#xff0c;这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列&#xff08;从 0 开始编号&#xff09;的元素之和为 colsum[i]&#xff0c;col…

为什么苹果内购总是失败_IOS用户支付失败 购买无法完成解决教程

格斗江湖iOS系统用户玩家&#xff0c;最近在充值的时候出现无法完成或者充值失败提示。这是怎么回事呢?出现上面的提示时&#xff0c;我们首先需要从自己“可控”的范围内查找原因。一、未越狱系统1、检查下自己的Apple ID是否有足够余额。2、中国大陆地区Apple ID账号&#x…

python中怎么创建配置文件_如何在Django中创建配置文件注册表单?

我试图创建一个定制的注册表单&#xff0c;但是我不知道如何去做&#xff0c;因为我试图将默认的django注册与一个新的模型连接起来。在这是它看起来的样子&#xff0c;可能是错的&#xff0c;但我正在考虑这样的事情。在模型.pyclass Profile(models.Model):user models.OneT…

pgadmin连接服务器失败_增值税发票税控软件:连接服务器失败是否使用离线文件进行更新?...

增值税发票税控软件&#xff1a;连接服务器失败是否使用离线文件进行更新&#xff1f;第一步&#xff1a;确认本地电脑是否可以正常打开网页&#xff1b;打开电脑&#xff0c;网页查看一下是否可以正常上网&#xff0c;打开百度发现&#xff0c;可以正常上网。第二步&#xff1…

移除镜像_这是否是你心目中的英雄联盟手游?镜像地图。水晶塔,传送移除

自从5月29日之后&#xff0c;RIOT官方放出了英雄联盟手游最新开发者日志后。关于视频内展示的多个游戏关键内容。在玩家群体中引起了大量的争议和讨论。以下是争议和讨论最多的内容1.游戏内英雄的攻击是否为AOE伤害?在大多数的玩家心中&#xff0c;英雄联盟手游是不应该有这种…

python数据算法有哪些_python算法与数据结构-常用查找算法一(37)

一、什么是查找查找(Searching)就是根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找表(Search Table)&#xff1a;由同一类型的数据元素(或记录)构成的集合关键字(Key)&#xff1a;数据元素中某个数据项的值&#xff0c;又称为键值…

circlegan_【源码解读】cycleGAN(二) :训练

训练的代码见于train.py&#xff0c;首先定义好网络&#xff0c;两个生成器A2B, B2A和两个判别器A, B&#xff0c;以及对应的优化器(优化器的设置保证了只更新生成器或判别器&#xff0c;不会互相影响)###### Definition of variables #######NetworksnetG_A2B Generator(opt.i…

电脑重启bootmgr_电脑出现bootmgr is missing怎么办

展开全部电脑开机&#xff0c;或者重启以后显示&#xff1a;Bootmgr is missing, 是代表硬盘的主引导记录(MBR)出错&#xff0c;从而导致无法引e68a8462616964757a686964616f31333337613931导系统&#xff0c;哪只能重建主引导记录&#xff0c;还有一个可能是丢失系统文件&…

python tkinter text改变文本字体颜色_如何更改Tkinter中文本的颜色?

在Tkinter图形用户界面中&#xff0c;我无法确定如何更改文本的颜色。我试着让Label1变成红色&#xff0c;Label2变成蓝色&#xff0c;Label3变成棕色&#xff0c;Label4变成黄色&#xff0c;但我似乎想不出来。提前谢谢&#xff1a;)import randomfrom Tkinter import * #dont…

qt 在label上以光标位置进行缩放_缩放|位移|渐变简单动画

本文简单介绍Qt的一些动画效果(缩放&#xff0c;位移&#xff0c;渐变)。缩放动画将窗口的geometry(位置&#xff0c;大小)属性作为动画参考实现缩放动画。代码QWidget *w new QWidget;w->setWindowTitle(QStringLiteral("缩放动画Qt君"));w->resize(320, 240)…

虚拟机中ubuntu可以使用显卡吗_在KVM下使用ubuntu19.10安装Anbox

导言&#xff1a;Anbox是一个Android模拟器&#xff0c;可以从linux系统运行Android应用程序或游戏。对于Anbox的安装已经有了各种教程&#xff0c;主要针对ubuntu18.04之前的版本。最近在做一个关于虚拟机中跑安卓的项目&#xff0c;因此在虚拟机中使用ubuntu18.04系统&#x…

mysql tree_MySQL树形遍历(二)

转载自:http://blog.csdn.net/dreamer0924/article/details/7580278英文原文:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/预排序遍历树算法&#xff1a;modified preorder tree traversal algorithm这个算法有如下几个数据结构1 lft 代表左 left2 r…