常见线性滤波(第一篇博客)

一、基本概念了解

1.什么是图像滤波?

官方解释:图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
个人理解:为图像滤波是通过设计合适的滤波器和阈值对平时工作和环境引起的噪声的减弱与抑制。

2.线性滤波

首先我们应该了解一下什么是平滑。平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。平滑的一种作用就是用来减弱噪声。OpenCV中提供了两类常见的滤波器用来对图像进行平滑处理。一类是线性滤波,包括 方框滤波(boxFilter)、均值滤波(blur)、高斯滤波(GaussianBlur);另一类是非线性滤波器,包括中值滤波(medianBlur)和双边滤波(bilateralFilter)。而本篇博客主要是对线性滤波进行学习总结。

3.卷积

卷积是两个变量在某范围内相乘后求和的结果(g(x,y)蓝色部分)。卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图像滤波。对于图像操作来说就是在每一个图像块(f(x,y)红色区域)与某个核(h(x,y))之间进行的运算。
在这里插入图片描述

4.算子(核)

核就是图像处理时,给定输入图像,在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核。核说白了就是一个固定大小的数值数组。该数组带有一个 锚点 ,一般位于数组中央。
示例

二、线性滤波器介绍

归一化块滤波器

官方解释是这样的:最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等),其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。包括方框滤波与均值滤波。
核如下:
核
函数原型如下:

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
  • src:输入图片。
  • dst:输出图像,应与原图像大小、类型一样。
  • ddepth:图像深度(图像深度是指存储每个像素所用的位数,也用于度量图像 的色彩分辨率。详细解释请自行搜索),-1表示与原图深度相同。
  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
  • borderType:一般默认为BORDER_DEFAULT ,目前不去了解。

1.方框滤波------boxFilter

函数原型如下:

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
  • src:输入图片。

  • dst:输出图像。

  • ddepth:图像深度

  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。

  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。

  • boolnormalize:bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。

  • borderType:一般默认为BORDER_DEFAULT 。
    运用如下:

    #include<opencv2/core/core.hpp>
     #include<opencv2/highgui/highgui.hpp>
     #include<opencv2/imgproc/imgproc.hpp>
     #include<iostream>
     
     
     using namespace cv;
     using namespace std;
     
     int main() {
     
     		//导入图片
     	
     	Mat srcImage = imread("E:/image/test.jpg"); 
     	if (!srcImage.data) {
     		printf("导入srcImage错误");
     		return 0;
     	}
    
     		//创建输出图像
     	
     	Mat boxFilterImage;	
     		
     		//调用boxFilter函数
     	
     	boxFilter(srcImage, boxFilterImage, -1, Size(3, 3), Point(-1, -1), false);
    
     	namedWindow("boxFilter");
     	imshow("boxFilter", boxFilterImage);
     	waitKey(0);
    
     	return 0;  
     	}
    

    原图如下
    在这里插入图片描述
    经过方框滤波后的图片
    在这里插入图片描述

2.均值滤波

在方框滤波中,当normalize=true的时候,方框滤波就变成了均值滤波。均值滤波是方框滤波归一化(normalized)后的特殊情况
函数原型如下:

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
  • src:输入图片。
  • dst:输出图像。
  • ddepth:图像深度。
  • ksize:可以看成Size(w,h),即内核大小( w 像素宽度, h 像素高度)。
  • anchor:指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。
  • borderType:一般默认为BORDER_DEFAULT 。
    运用如下:

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main() {
	
	//导入图片
	Mat srcImage = imread("E:/image/test.jpg"); 
	if (!srcImage.data) {
		printf("导入srcImage错误");
		return 0;
	}

	//创建输出图像
	Mat blurImage;			
	//调用blur函数
	blur(srcImage, blurImage, Size(3, 3), Point(-1, -1));

	namedWindow("blur");
	imshow("blur", blurImage);
	imwrite("E:/image/test_2.jpg", blurImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述

3.高斯滤波

高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。它是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程
函数如下

 void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
  • src: 输入图像
  • dst: 输出图像
  • kisize:可理解为Size(w, h) 定义内核的大小(需要考虑的邻域范围)。 w 和 h 必须是正奇数,否则将使用\sigma_x 和 sigma_y 参数来计算内核大小。
  • sigma_x: x 方向标准方差, 如果是 0 则 sigma_x 使用内核大小计算得到。
  • sigma_y: y 方向标准方差, 如果是 0 则 sigma_y 使用内核大小计算得到。.
  • borderType:一般默认为BORDER_DEFAULT 。

运用如下:


#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>


using namespace cv;
using namespace std;

int main() {
	
	//导入图片
	Mat srcImage = imread("E:/image/test.jpg"); 
	if (!srcImage.data) {
		printf("导入srcImage错误");
		return 0;
	}

	//创建输出图像
	Mat gussianblurImage;			
	//调用blur函数
	GaussianBlur(srcImage, gussianblurImage, Size(3, 3),0,0);

	namedWindow("gussianblur");
	imshow("gussianblur", gussianblurImage);
	imwrite("E:/image/test_3.jpg", gussianblurImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述
参考:
https://blog.csdn.net/poem_qianmo/article/details/22745559

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter.html#id5

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 粒子滤波(Particle Filter)是一种非线性滤波方法,可以用于估计状态变量的后验概率分布。它结合了蒙特卡罗方法和贝叶斯推断的思想,在各种实际应用中都有广泛的应用。粒子滤波主要分为向前滤波和向后滤波两种。 向前滤波是指在每个时间步骤$t$上根据当前的观测值$z_t$和前一时间步骤$t-1$上的粒子状态$\{x_{t-1}^i, w_{t-1}^i\}$,通过状态转移模型进行新一时间步骤$t$上的状态采样,即从先验概率$p(x_t|x_{t-1}^i)$中采样得到新的粒子状态$\{x_t^i\}$。而后计算每个粒子的权重$w_t^i$,作为粒子权重$p(x_t^i|z_t,x_{t-1}^i)$的重要度权重。 向后滤波是指根据当前的观测值$z_t$和后一时间步骤$t+1$上的粒子状态$\{x_{t+1}^i, w_{t+1}^i\}$,通过逆向状态转移模型进行新一时间步骤$t$上的状态采样,即从先验概率$p(x_t|x_{t+1}^i)$中采样得到新的粒子状态$\{x_t^i\}$。再计算每个粒子的权重$w_t^i$,作为粒子权重$p(x_t^i|z_t,x_{t+1}^i)$的重要度权重。 在MATLAB中,可以通过以下步骤实现粒子滤波的向前滤波和向后滤波: 1. 初始化粒子状态$\{x_{t-1}^i, w_{t-1}^i\}$。 2. 根据状态转移模型$p(x_t|x_{t-1}^i)$采样得到新的粒子状态$\{x_t^i\}$。 3. 计算每个粒子的权重$w_t^i$,根据观测模型$p(z_t|x_t^i)$计算重要度权重。 4. 根据粒子权重$w_t^i$进行重采样,得到新的粒子状态$\{x_{t-1}^i, w_{t-1}^i\}$。 5. 重复步骤2-4,直到达到最后一个时间步骤。 向后滤波的步骤与向前滤波相似,只是粒子状态的采样方向相反。具体实现上,可以借助MATLAB中的随机数生成函数和矩阵运算函数来实现粒子滤波算法的向前滤波和向后滤波。 ### 回答2: 粒子滤波是一种用于非线性非高斯系统的滤波方法,其基本思想是利用一组经验粒子来表示系统的状态分布,并通过重要性重采样来更新粒子的权重,从而实现对系统状态的估计。 向前滤波(forward filtering)是粒子滤波的一种常见实现方式。它的过程如下: 1. 初始化粒子集合:根据初始的状态分布,生成一组具有随机初始状态的粒子,并为每个粒子赋予相同的权重。 2. 预测阶段:根据系统的状态转移方程,对每个粒子的状态进行随机演化,从而得到每个粒子在下一个时间步的预测状态。 3. 更新阶段:根据观测模型,计算每个粒子在给定观测条件下的权重,并进行归一化,以反映观测信息对系统状态的贡献。 4. 重采样阶段:根据粒子的权重,对粒子集合进行重采样,即根据粒子的权重,有放回地从粒子集合中进行抽样,从而产生新的粒子集合。 5. 返回步骤2,重复进行预测、更新和重采样,直到达到滤波的终止条件。 向后滤波(backward filtering)则是在观测序列已经全部给定的情况下,基于后验概率进行的一种滤波方法。其大致步骤如下: 1. 初始化粒子集合:根据后验概率密度函数(即已知的观测序列),生成一组具有随机初始状态的粒子,并为每个粒子赋予相同的权重。 2. 逐步回退:从观测序列的最后一个观测开始,逐步向前进行;对于每个时间步,根据当前观测和已有的粒子集合,通过重要性重采样更新粒子的权重。 3. 返回步骤2,直到到达观测序列的第一个观测,此时得到的粒子集合即为后验概率分布的近似。 Matlab提供了丰富的工具箱和函数,可用于实现粒子滤波算法的向前滤波和向后滤波。这些函数通常基于向量化计算和并行计算,以提高计算效率。可以通过调用相关的函数,按照上述步骤来实现粒子滤波的向前滤波和向后滤波。 ### 回答3: 粒子滤波是一种基于蒙特卡罗方法的概率滤波技术,可以用于非线性、非高斯系统的状态估计。在粒子滤波中,向前滤波和向后滤波是两种常用的算法。 向前滤波(Forward Filtering)是指在每个时间步之后,根据当前的状态估计和测量值,更新下一个时间步的样本集合。具体步骤如下: 1. 初始化粒子样本集合,包括初始状态和权重。 2. 针对每个粒子,通过状态转移方程产生下一个时间步的预测状态。 3. 根据测量模型,计算每个预测状态对应的观测值。 4. 根据观测值和测量模型,计算每个粒子的似然权重。 5. 根据权重,利用重采样技术从当前样本中选择新的样本,用于下一个时间步的状态估计。 6. 重复步骤2到5,直到达到终止条件。 向后滤波(Backward Smoothing)是指在每个时间步之后,根据当前的状态估计和后续时间步的样本集合,更新之前的时间步的样本集合。具体步骤如下: 1. 按照向前滤波的步骤,获得当前时间步的粒子样本集合。 2. 从当前时间步开始,向后逐个时间步处理,进行以下操作: - 根据系统动态模型,从后续时间步的样本集合中,生成当前时间步的预测状态。 - 根据观测模型,计算当前时间步的预测状态对应的观测值。 - 根据当前时间步的预测状态与观测值,计算更新后的粒子样本权重。 - 利用重采样技术从当前时间步的样本中选择新的样本,用于更新之前时间步的状态估计。 3. 重复步骤2,直到处理完所有时间步。 通过向前滤波和向后滤波,可以获得更准确和稳定的状态估计结果,并对系统的状态进行更深入的分析。在MATLAB中,可以利用相关的函数和工具箱来实现粒子滤波、向前滤波和向后滤波的计算和模拟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值