精华内容
下载资源
问答
  • Opencv2.4学习::滤波(5)导向滤波

    千次阅读 2018-09-18 17:47:16
    下引用 https://blog.csdn.net/baimafujinji/article/details/74750283 的一段话来说明导向滤波的作用:  无论是简单平滑,还是高斯平滑,它们都有一个共同的弱点,即它们都属于各向同性滤波。我们都知道,一幅...

    滤波系列:

    1. 均值滤波

    2. 中值滤波
    3. 高斯滤波
    4. 双边滤波

    导向滤波 

    下引用 https://blog.csdn.net/baimafujinji/article/details/74750283 的一段话来说明导向滤波的作用:

     无论是简单平滑,还是高斯平滑,它们都有一个共同的弱点,即它们都属于各向同性滤波。我们都知道,一幅自然的图像可以被看成是有(过渡平缓的,也就是梯度较小)区域和(过渡尖锐的,也就是梯度较大)边缘(也包括图像的纹理、细节等)共同组成的。噪声是影响图像质量的不利因素,我们希望将其滤除。噪声的特点通常是以其为中心的各个方向上梯度都较大而且相差不多。边缘则不同,边缘相比于区域也会出现梯度的越变,但是边缘只有在其法向方向上才会出现较大的梯度,而在切向方向上梯度较小。

    因此,对于各向同性滤波(例如简单平滑或高斯平滑)而言,它们对待噪声和边缘信息都采取一直的态度。结果,噪声被磨平的同时,图像中具有重要地位的边缘、纹理和细节也同时被抹平了。这是我们所不希望看到的。研究人员已经提出了很多Edge-perserving的图像降噪(平滑)算法,例如双边滤波、自适应(维纳)平滑滤波(请参见文献【1】)、基于PM方程的各向异性滤波以及基于TV-norm的降噪算法等。本文将考虑在文献【2】中提出的另外一种Edge-perserving的图像滤波(平滑)算法——导向滤波(Guided Filter)。当然,通过阅读文献【2】,我们也知道导向滤波的应用不止有Edge-perserving的图像平滑,还包括图像去雾、图像Matting等等。

    下给出处理流程图:

    从图中也可以看出,导向滤波的输入为两个,一个是真实的输入p,另一个是引导输入I。输出为q,是p和I共同作用的产物。


    实现代码:

    #include<opencv2/core/core.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    //导向滤波器
    Mat guidedfilter(Mat &srcImage, Mat &srcClone, int r, double eps)
    {
    	//转换源图像信息
    	srcImage.convertTo(srcImage, CV_64FC1);
    	srcClone.convertTo(srcClone, CV_64FC1);
    	int nRows = srcImage.rows;
    	int nCols = srcImage.cols;
    	Mat boxResult;
    	//步骤一:计算均值
    	boxFilter(Mat::ones(nRows, nCols, srcImage.type()),
    		boxResult, CV_64FC1, Size(r, r));
    	//生成导向均值mean_I
    	Mat mean_I;
    	boxFilter(srcImage, mean_I, CV_64FC1, Size(r, r));
    	//生成原始均值mean_p
    	Mat mean_p;
    	boxFilter(srcClone, mean_p, CV_64FC1, Size(r, r));
    	//生成互相关均值mean_Ip
    	Mat mean_Ip;
    	boxFilter(srcImage.mul(srcClone), mean_Ip,
    		CV_64FC1, Size(r, r));
    	Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
    	//生成自相关均值mean_II
    	Mat mean_II;
    	//应用盒滤波器计算相关的值
    	boxFilter(srcImage.mul(srcImage), mean_II,
    		CV_64FC1, Size(r, r));
    	//步骤二:计算相关系数
    	Mat var_I = mean_II - mean_I.mul(mean_I);
    	Mat var_Ip = mean_Ip - mean_I.mul(mean_p);
    	//步骤三:计算参数系数a,b
    	Mat a = cov_Ip / (var_I + eps);
    	Mat b = mean_p - a.mul(mean_I);
    	//步骤四:计算系数a\b的均值
    	Mat mean_a;
    	boxFilter(a, mean_a, CV_64FC1, Size(r, r));
    	mean_a = mean_a / boxResult;
    	Mat mean_b;
    	boxFilter(b, mean_b, CV_64FC1, Size(r, r));
    	mean_b = mean_b / boxResult;
    	//步骤五:生成输出矩阵
    	Mat resultMat = mean_a.mul(srcImage) + mean_b;
    	return resultMat;
    }
    void main()
    {
    	Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
    	if (!srcImage.data){
    		cout << "falied to read" << endl;
    		system("pause");
    		return;
    	}
    	imshow("srcImage", srcImage);
    	//通道分离
    	vector<Mat> vSrcImage, vResultImage;
    	split(srcImage, vSrcImage);
    	Mat resultMat;
    	for (int i = 0; i < 3; i++){
    		//分通道转换成浮点型
    		Mat tempImage;
    		vSrcImage[i].convertTo(tempImage, CV_64FC1, 1.0 / 255.0);
    		Mat p = tempImage.clone();
    		//分别进行导向滤波
    		Mat resultImage = guidedfilter(tempImage, p, 10, 0.01);
    		vResultImage.push_back(resultImage);
    	}
    	//通道结果合并
    	merge(vResultImage, resultMat);
    	imshow("resultMat", resultMat);
    	waitKey(0);
    }

    实现效果:

    展开全文
  • 背景介绍:MPU6050 姿态解算系列目的是让初学者容易入门,所以...Sugar 本篇的目标是:用更通俗易懂的方式表达“线性 Kalman 滤波的效果”,让读者不需要太深的数学功底就能知道线性 Kalman 滤波的作用。思维铺垫K...

    背景介绍:
    MPU6050 姿态解算系列目的是让初学者容易入门,所以表述上一直淡化有难度的数学语言而改用“文字语言的数学形式”。Kalman 滤波涉及的数学内容比较多,网上有很多讲卡尔曼滤波原理的文章,数学功底欠佳的读者可能看不懂。Sugar 本篇的目标是:用更通俗易懂的方式表达“线性 Kalman 滤波的效果”,让读者不需要太深的数学功底就能知道线性 Kalman 滤波的作用。

    思维铺垫

    Kalman 滤波用状态空间来描述研究对象,是一种时域下的滤波方法。在正式进入算法讲解之前,先罗列几个 Sugar 觉得比较重要的点来做预先的思维导向:
    1、在 Kalman 滤波方法中,系统的观测噪声是状态估计所依赖的重要信息,并不是需要滤除的对象。
    2、因为 Kalman 滤波是在时域下的递推形式,所以计算量较小,容易实现。
    3、Kalman 滤波器可以看成:是状态变量在由观测生成的线性空间上的投影。

    Kalman 滤波器与投影

    “投影”英文是“projection”。

    上面“思维铺垫”的第 3 点,我们可以这样写:

    基于 k 个观测值对 j 时刻状态的估计 = proj( j 时刻系统的真实状态 | k 个观测值)

    表示:j 时刻的状态估计j 时刻真实状态由某一角度上的 k 个观测值生成的线性空间上的投影。读着比较绕,下面 Sugar 举个实际的例子,在这个例子里,注意找到状态估计真实状态,并理解什么是某一角度,例:

    Sugar 在屋里写推文,听到阳台窗子的风声。
    Sugar 想:“外面正在刮多大的风呢?”
    在不打开窗子的情况下:Sugar 看窗外柳树的摆动幅度,
    默默观察一会儿(默记了 k 个幅度值),
    估计现在有 3 级风力。

    状态估计现在有 3 级风力真实状态在刮某一级风,并不确切知道风力某一角度在屋里不开窗靠眼力估计风力的角度
    现在,我们可以把 Kalman 滤波的投影解释写的稍微数学一点:

    X'(j|k) = proj( X(j) | Y(1), Y(2), ..., Y(k) )

    X'(j|k) 表示 基于 k 个观测值对 j 时刻状态的估计X(j) 表示 j 时刻的真实状态,显然这个是并不知道的;Y(1), Y(2), ..., Y(k) 表示 k 个观测生成的线性空间

    延伸:对于 j=k, j>k, jX'(j|k)为 Kalman 滤波器、预报器和平滑器。滤波器一般是对当前状态噪声的处理。

    状态描述

    1、状态转移

    07469e661f296a2d839449195f5754c5.png

    A称作状态转移矩阵,这个公式的意思是:系统当前的状态能够通过用状态转移矩阵对上一时刻的状态进行转移,再加上系统当前的实际噪声来表示。
    2、状态观测

    13091437fb551a4f22c93c23d4e643d0.png

    z(t)表示对当前系统的观测值,这个公式是说:系统当前的观测值就是系统当前的状态当前观测噪声v(t)之和 。C观测矩阵表示:对哪个目标进行了观测。
    3、系统状态受额外影响的情况

    2d547da3b577443a81d43f1cfcafd3ef.png

    (1) 什么叫额外影响
    自由落体运动的观测为例,我们的目标观测量是“位置”和“速度”,而因为受到重力加速度的影响,我们目标观测量“位置”和“速度”都会受到影响。这里重力加速度g就叫额外影响
    (2) B*u(t)是什么
    位移速度为例,第 1 点中的状态转移方程能描述“均速”运动,若速度是变化的,那么就要把速度变化对系统状态的影响考虑进来。但在状态转移矩阵 A 中只有“速度对位移的影响”,如果要引入加速度对速度和位移的影响,就要加上这个 B*u(t)

    上面引出的比较突然,Sugar 在 github 上准备了三个线性 Kalman 应用的 MATLAB 实时脚本用来解释上面的内容,在公众号回复 Kalman 获得。因为这里的内容很多,放推文里太占篇幅,所以就突然出现一下,点到为止了。

    在做线性 Kalman 滤波的时候,因为我们并不知道系统的真实状态,所以我们会用系统当前的状态估计来代替系统当前的状态。既然不知道真实状态,自然也不可能知道系统当前的实际噪声w(t),那么这个噪声该怎么办呢?答案是:忽略掉。因为噪声对系统的影响小,解决滤波问题才有意义。如果噪声已经大到足以覆盖系统状态的话,我们要考虑换个角度观测(就像在嘈杂的环境下打电话,如果听不清,最好的方法是换个清静的地方或者带上耳机,只是冲着电话大声喊对于听力是没有帮助的)。
    说到这里,用于实际编程的公式就变成了:

    b7c9d61633a33544a4dff28aaf6416e9.png

    e0a489c06d93c8a9531a0a4d886c2eef.png

    线性 Kalman 滤波方程

    在理解上面的内容后,我们只要记住下面 5 个方程就可以去设计线性 Kalman 滤波器了。

    1、时间更新方程(2个)

    c099e1eb19a8d326c39de281c0fcd8cf.png

    c63568fb2729dc2b47887a2b0dddcce9.png

    Q系统噪声方差,我们在第一个公式里忽略了系统噪声,这个系统噪声方差就变成了需要手调的值,其实际意义就是:给手动干预留下的一个入口。P协方差,描述估计值的准确程度。在线性 Kalman 滤波里P不是我们关心的重点,只要按公式计算就行了。
    注意:B*u(t)可选项,并不是一定要加上,加与不加要看是否有额外影响目标观测量的因素

    2、状态更新方程(3个)

    c0e80e08c714f935f038ea1755b39134.png

    R观测的方差,这个我们可以通过观测值的统计数据获得。KKalman 增益,其作用就是调整滤波程度的大小。

    081f932ea1e23a6ad71124a5cc0dfbf1.png

    从这个公式我们来重新理解一下“思维铺垫”里的第 1 个点:Kalman 滤波是在利用系统当前的观测噪声。

    f9e5407f13dd60e46b414223bb08f29e.png

    最后一步是协方差P的迭代。

    线性 Kalman 滤波用于姿态解算

    以姿态解算为例,一步一步按上面的规则设计一个线性 Kalman 滤波器。

    一、确定目标量

    姿态解算我们关注的是:横滚角横滚角速度俯仰角俯仰角速度。把这些目标量装到 state_estimate 列向量里,如下:

    state_estimate = [横滚角; 横滚角速度; 俯仰角; 俯仰角速度];

    为了便于表示,我们把文字改成英文:

    state_estimate = [phi; phi_rate; theta; theta_rate];

    二、确定状态转移矩阵

    A =[ 1, dt, 0,  0][ 0,  1, 0,  0][ 0,  0, 1, dt][ 0,  0, 0,  1]

    为什么 A 长这样的?我们看下 MATLAB 怎么说:

    >> A*state_estimateans =     phi + dt*phi_rate              phi_rate theta + dt*theta_rate            theta_rate

    这样容易看出:结果仍然符合我们第一步确定的目标量的排列方式。

    三、确定要不要有 B*u(t)

    在姿态解算中,我们的目标量是“横滚角”、“俯仰角”、“横滚角速度”和“俯仰角速度”,这些都可以通过 MPU6050 观测到,没有影响目标量的额外因素。因此,在本篇的姿态解算中不需要 B*u(t)

    四、系统噪声 Q

    系统噪声 Q 是留出的手动调节参数,看下 Sugar 在 MATLAB 里是怎么把这个调节接口留出来的:

    var_acc_init   = 1e-2;var_gyro_init  = 6.75e0;var_acc        = [var_acc_init, var_acc_init]';var_gyro       = [var_gyro_init, var_gyro_init]';Q = eye(4);Q(1,1) = Q(1,1) * var_acc(1);Q(2,2) = Q(2,2) * var_gyro(1);Q(3,3) = Q(3,3) * var_acc(2);Q(4,4) = Q(4,4) * var_gyro(2);

    五、观测噪声 R

    观测噪声要随采样计算,Sugar 在 MATLAB 里取的是每一时刻的前 10 个采样值的方差给观测噪声 R,MATLAB 的程序是这样的:

    cnt = 10;if i>cnt    var_acc(:,i)  = [var(phi_acc(size(phi_acc,1)-cnt:end)), var(theta_acc(size(theta_acc,1)-cnt:end))]';    var_gyro(:,i) = [var(phi_rate_gyro(size(phi_rate_gyro,1)-cnt:end)), var(theta_rate_gyro(size(theta_rate_gyro,1)-cnt:end))]';else    var_acc(:,i)  = [var(phi_acc), var(theta_acc)]';    var_gyro(:,i) = [var(phi_rate_gyro), var(theta_rate_gyro)]';endR = eye(4);R(1,1) = R(1,1) * var_acc(1,i);R(2,2) = R(2,2) * var_gyro(1,i);R(3,3) = R(3,3) * var_acc(2,i);R(4,4) = R(4,4) * var_gyro(2,i);

    六、应用线性 Kalam 的 5 个公式开始递推

    这一步没太多要说的,直接用上面介绍过的 5 个公式就行了,如下:

    state_estimate = A * state_estimate;P = A * P * A' + Q;K = P * C' * inv(R + C * P * C');state_estimate = state_estimate + K * (measurement - C * state_estimate);P = (eye(4) - K * C) * P;

    效果视频

    Sugar 姿态解算系列推文重在算法入门,所有算法都是通过 MPU6050 的原始数据在 MATLAB 上做的。在公众号回复 att 得到全部的 MATLAB 代码。  

    Sugar 姿态解算系列实验的设计如下:
    1、STM32 读取 MPU6050 数据;
    2、STM32 用 mavlink 打包数据,通过串口传给
    ESP8266 Wifi 数传;3、ESP8266 将串口接收到的 mavlink 包以 UDP 形式传到 Wifi 上;
    4、MATLAB 从 Wifi 接 UDP 包并解析出 mavlink 报文得到数据;
    5、用 MATLAB 研究算法。

    姿态解算系列是在第 5 步展开的,而关注 Sugar 比较久的读者会知道 Sugar 在前 4 步上花的精力更多。前 4 步是通用的实验方法,学会了可以自定义任何实验。有关 mavlink 协议相关内容可以在公众号后台回复 mavlink 获得。

    后面 Sugar 会继续姿态解算系列,计划不会再深入算法,而是打算写一写怎么把已经在 MATLAB 上验证过的算法写到单片机上。

    参考链接

    卡尔曼滤波器
    https://longaspire.github.io/blog/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2/

    展开全文
  • 写在开头 ...锐化算法的作用是加强图像边缘细节,对于图像而言,低频分量是图像的主要内容,而高频分量则是图像的边缘细节或噪声。因此,高斯滤波作为一种低通滤波,其实是会屏蔽掉一些高通分量。 ...

    写在开头
    其实我写的所有算法都和ISP(图像信号处理)算法有强烈的关系,这些算法对目标检测、识别、跟踪的效果是怎样的呢。我正着手开一栏关于该问题的文章。

    锐化

    锐化算法的作用是加强图像边缘细节,对于图像而言,低频分量是图像的主要内容,而高频分量则是图像的边缘细节或噪声。因此,高斯滤波作为一种低通滤波,其实是会屏蔽掉一些高通分量。
    https://blog.csdn.net/hhygcy/article/details/4330939
    该博主提到了通过原图减高斯滤波后的图,得到边缘图,再加上原图,得到一张锐化图的方法。
    如果大家对SIFT算法有了解的话,就会知道,该算法其实是DOG算子,LOG算子的降级版。这两种算法,在这里就不一一说明了。
    所有的边缘检测方法,都可以称为锐化或图像增强的一环,常见的sobel、canny算子等都是效果颇佳的锐化mask。

    这里我们讲一个有意思的算法,他完全可以称作锐化算法,叫做导向滤波。
    https://blog.csdn.net/weixin_43194305/article/details/88959183
    该博主已经说的非常清楚了,对于某些东西,却没有解释,容易让初学者不明所以。
    在这里插入图片描述
    该公式其实是对比度、亮度公式,导向滤波认为,边缘保持图q基本是由引导图I经过对比度、亮度调整得到的。
    在这里插入图片描述
    如上公式的意义,应该是说在一定空间内,保持引导图和边缘保持图呈对比度关系的情况下,使噪声最小。(其实还是会损失很微小的细节,但大多数是噪声)
    我把单通道导向滤波的实现代码贴在下面了,简化了导向滤波的部分内容,有兴趣的可以试一试。

    include "opencv2/core.hpp"
    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/videoio.hpp"
    //#include <iostream>
    //#include <math.h>
    
    using namespace cv;
    using namespace std;
    
    
    void GuidedFilter(const Mat &I,const Mat &P,Mat &Q)
    {
    	int dx[] = { -1,0,1};
    	int dy[] = { -1,0,1};
    	double s = 1;
    	for (int i = 0; i < I.rows; i++)
    	{
    		for (int j = 0; j < I.cols; j++)
    		{
    			if (i <= 0 || j <= 0|| i >= I.rows -1|| j >= I.cols-1)
    				continue;
    			double IP = 0;
    			double bk = 0;
    
    			double mk = 0;
    			double fk = 0;
    
    			double ak = 0;
    			double pk = 0;
    			for (int k = 0; k < 3; k++)
    			{
    				for (int m = 0; m < 3; m++)
    				{
    					IP += I.at<uchar>(i + dx[k], j + dy[m])*(P.at<uchar>(i + dx[k], j + dy[m]));
    					pk += P.at<uchar>(i + dx[k], j + dy[m]);
    					mk += I.at<uchar>(i + dx[k], j + dy[m]);
    				}
    			}
    
    			pk /= 9.0;
    			mk /= 9.0;
    			for (int k = 0; k < 3; k++)
    			{
    				for (int m = 0; m < 3; m++)
    				{
    					
    					double temp = mk - (double)I.at<uchar>(i + dx[k], j + dy[m]);
    					fk += temp * temp;
    				
    				}
    			}
    			fk = fk/9.0;
    			ak = (IP / 9.0 - mk * pk) / (fk + s);
    			bk = pk - ak * mk;
    			int temp = ak * I.at<uchar>(i , j ) + bk;
    			Q.at<uchar>(i , j )= temp >= 255 ? 255  : temp;
    		}
    	}
    }
    
    int main()
    {
    	Mat img = imread("lena.jpg", CV_8U);
    	Mat Gs;
    	Mat result(img.size(), CV_8U);
    	img.copyTo(Gs);
    	GaussianBlur(img, Gs, cv::Size(7, 7), 10, 10);
    	GuidedFilter(Gs, img, result);
    	Mat dif = result - Gs;
    	imshow("r", result);
    	imshow("Gs",Gs);
    	imshow("img", img);
    	imshow("dif", dif);
    	waitKey();
    }
    

    原图
    在这里插入图片描述

    高斯图
    在这里插入图片描述
    导向滤波
    在这里插入图片描述
    差分图像
    在这里插入图片描述

    展开全文
  • 图像处理-4 图像滤波

    2020-04-27 17:10:15
    图像滤波的作用: 1、消除图像中混入的噪声; 2、为图像识别抽取出图像特征 均值滤波 首先看均值滤波的计算公式: g(x,y)为该邻域的中心像素,n跟系数模版大小有关,一般3*3邻域的模板,n取为9,如: 当然,模板...

    图像滤波算法介绍

    • 均值滤波算法
    • 方框滤波算法
    • 高斯滤波算法
    • 双边滤波(有空在写)
    • 导向滤波(有空再写)

    图像滤波的作用:
    1、消除图像中混入的噪声;
    2、为图像识别抽取出图像特征

    均值滤波

    首先看均值滤波的计算公式:

    g(x,y)为该邻域的中心像素,n跟系数模版大小有关,一般3*3邻域的模板,n取为9,如:

    当然,模板是可变的,一般取奇数,如5 * 5 , 7 * 7等等。

    其实结果就是取领域的灰度值进行平均。

    优点 :均值滤波算法比较简单,计算速度快,均值滤波对周期性的干扰噪声有很好的抑制作用。
    缺点 :但是均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时,也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

    方框滤波

    方框滤波在原理上是指,采用一个卷积核对图像进行卷积

    其中:
    当采用归一化之后其实就是均值滤波。 ### 中值滤波 中值滤波是指将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替。常用于消除图像中的椒盐噪声。

    与低通滤波不同的是,中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊,但它会洗去均匀介质区域中的纹理。这些优良特性是线性滤波方法所不具有的。
    中值滤波能减弱或消除傅里叶空间的高频分量,同时也影响低频分量。中值滤波去除噪声的效果依赖于两个要素:邻域的空间范围和中值计算中涉及的像素数。一般说来,小于滤波器面积一半的亮或暗的物体基本上会被滤除,而较大的物体几乎会原封不动地保存下来,因此中值滤波器的空间尺寸必须根据现有的问题来进行调整。

    高斯滤波

    应用:** 高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声,如传统车牌识别等。

    高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的为1,而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小,更能够保持图像的整体细节。

    二维高斯分布
    高斯分布公式终于要出场了!

    在这里插入图片描述
    其中不必纠结于系数,因为它只是一个常数!并不会影响互相之间的比例关系,并且最终都要进行归一化,所以在实际计算时我们是忽略它而只计算后半部分:
    在这里插入图片描述
    其中(x,y)为掩膜内任一点的坐标,(ux,uy)为掩膜内中心点的坐标,在图像处理中可认为是整数;σ是标准差。

    例如:要产生一个3×3的高斯滤波器模板,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向下)。

    在这里插入图片描述
    这样,将各个位置的坐标带入到高斯函数中,得到的值就是模板的系数。
    对于窗口模板的大小为 (2k+1)×(2k+1),模板中各个元素值的计算公式如下:

    在这里插入图片描述
    这样计算出来的模板有两种形式:小数和整数。

    • 小数形式的模板,就是直接计算得到的值,没有经过任何的处理;
    • 整数形式的,则需要进行归一化处理,将模板左上角的值归一化为1,具体介绍请看这篇博文。使用整数的模板时,需要在模板的前面加一个系数,系数为模板系数和的倒数。

    生成高斯掩膜(小数形式)
    知道了高斯分布原理,实现起来也就不困难了。

    首先我们要确定我们生产掩模的尺寸wsize,然后设定高斯分布的标准差。生成的过程,我们首先根据模板的大小,找到模板的中心位置center。 然后就是遍历,根据高斯分布的函数,计算模板中每个系数的值。

    最后模板的每个系数要除以所有系数的和。这样就得到了小数形式的模板。

    实现示例(c++)

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
     
    using namespace cv;
     
    int main()
    {
    	//载入图像
    	Mat image = imread("1.jpg");
    	Mat dst1 , dst2,dst3;
    	 //均值滤波
    	blur(image, dst1, Size(7, 7));
    	//方框滤波
    	cv::boxFilter(image, dst2, -1, cv::Size(7, 7), cv::Point(-1, -1), true, cv::BORDER_CONSTANT);
    	//高斯滤波
    	cv:: GaussianBlur(image, dst3,cv::Size(7, 7),0.8);
    	
        //创建窗口并显示
    	imshow("均值滤波效果图", dst1);
        imshow("方框滤波效果图", dts2);
        imshow("高斯滤波效果图", dts3);
    	waitKey(0);
    	return 0;
    }
    

    双边滤波

    导向滤波

    展开全文
  • opencv学习 - 图像平滑

    2019-06-06 18:42:01
    每一幅图像都包含某种程度噪声,在大多数情况下,通过平滑技术(也常称为滤波技术)...具备保持边缘作用的平滑算法双边滤波、导向滤波等。 二维离散卷积 二维离散卷积是基于两个矩阵一种计算方式 如I=(1234)...
  • 平滑技术(滤波技术)可以抑制或者消除图像噪声,常用平滑处理算法包括二维离散卷积高斯平滑、均值平滑,基于统计学方法中值平滑,具备保持边缘作用的平滑算法双边滤波、导向滤波等。 1.二维离散卷积 卷积...
  • 局部预处理可以分为二种,一种是平滑,一种是梯度算子。...常见有基于二维离散卷积高斯平滑、均值平滑、基于统计学习方法中值平滑,具备保持边缘双边滤波、导向滤波等。 OpenCV提供函数cv2.filte...

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

导向滤波的作用