基于matlab初识空间滤波器

本文介绍了在MATLAB中使用imnoise添加噪声的方法,以及各种空间滤波器如高斯、拉普拉斯、LoG和排序统计滤波(如中值滤波)的原理和应用,特别提到了RGB图像与二维灰度图像处理的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.加噪声

使用imnoise对原始图像进行添加噪声,用法如下。

此说明来自matlab官方

2.空间滤波器

2.1线性空间滤波器

matlab中可通过fspecial得到一个滤波器w

w = fspecial('type',parameters);
% type 规定滤波器的类型,parameters进一步定义

常见类型如下:

平均滤波器:

% 规定一个大小为r*c的平均滤波器,默认为3*3,可用单个数替代r*c
w = fspecial('average',[r c]);

高斯滤波器:

% 规定一个大小为r*c,标准差为sig的高斯低通滤波器,默认值为3*3和0.5
w = fspecial('gaussian',[r c],sig)

高斯滤波器是通过离散化的高斯函数计算得到的。σ越大,数据分布越分散,滤波器越平缓,σ越小,数据分布越集中,滤波器越陡峭。根据高斯曲线分布,可以计算出模板,进行滤波。标准差越大,分布的峰值越宽,曲线越扁平;标准差越小,分布的峰值越窄,曲线越尖锐。标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。

gau1 = fspecial('gaussian',[3,3],1);

gau2 = fspecial('gaussian',[3,3],10);

拉普拉斯滤波器:

% 根据alpha值得到拉普拉斯模板,模板大小为3*3,alpha取[0,1],默认为0.2
w = fspecial('laplacian',alpha);

拉普拉斯滤波器可用于图像增强,一般使用时需用原图减滤波后图像以得到质量更高的图像。

LoG滤波器(高斯-拉普拉斯滤波器):

% 默认值为5*5和0.5
w = fspecial('log',[r c],sig);

噪声会影响拉普拉斯滤波,可以先进行高斯滤波。

由于卷积操作具有结合律,可以先将高斯平滑滤波器与拉普拉斯滤波器进行卷积,然后利用得到的滤波器去对图片进行滤波。

2.2非线性空间滤波

排序统计滤波器:

% 将 A 中的每个元素替换为由 domain 中的非零元素指定的A中相邻元素的有序集中的第 order 个元素
B = ordfilt2(A,order,domain)

详细用法参考此处

基于此可实现中值滤波器

g = ordfilt2(f,(m*n+1)/2,ones(m,n));
% matlab中给出了专用实现,padopt指定边界填充选项,zeros(默认),symmetric,indexed
g = medfilt2(f,[m n],padopt)

3.使用滤波器

所谓滤波,可用imfilter实现,可分为相关和卷积两种,卷积可理解为卷积核旋转180°再进行相关(此处旋转,顺时针or逆时针得到的矩阵是相同的)。

Fimage =imfilter(image,w); % w为卷积核,默认为相关,填充0,输出和输入大小相同。
Fimage =imfilter(image,w,'conv',boundary_options,'full'); % boundary_options边界扩展选项

问题

在使用imfilter滤波时发现三维RGB图像可以用二维矩阵进行滤波。

因为imfilter函数会自动对 RGB 图像的每个颜色通道分别运用相同的二维滤波核开展滤波操作。

### Kalman去噪算法的Matlab实现 Kalman滤波是一种有效的信号去噪方法,它能够通过状态空间模型和贝叶斯估计从含噪声的数据中提取有用的信息。以下是几个常见的Kalman滤波在Matlab中的实现代码示例。 #### 示例一:基于DvKalman卡尔曼滤波的信号去噪 下面展示了一个使用DvKalman卡尔曼滤波器进行信号去噪的例子[^1]: ```matlab clear all; close all; clc; Nsamples = 500; Xsaved = zeros(Nsamples, 2); Zsaved = zeros(Nsamples, 1); for k=1:Nsamples z = GetSonar(); [pos vel] = DvKalman(z); Xsaved(k, :) = [pos vel]; Zsaved(k) = z; end dt = 0.02; t = 0:dt:Nsamples*dt-dt; figure; hold on; plot(t, Zsaved(:), 'r.'); plot(t, Xsaved(:, 1)); figure; plot(t, Xsaved(:, 2)); ``` 此代码模拟了声呐数据采集并应用DvKalman函数对其进行处理的过程。 --- #### 示例二:经典卡尔曼滤波应用于正弦波信号去噪 另一个例子展示了如何用经典的卡尔曼滤波去除加性白噪声的影响[^2]: ```matlab % 参数定义 fs = 1000; % 采样率 t = 0:1/fs:1; % 时间向量 f = 5; % 正弦波频率 x = sin(2*pi*f*t); % 原始信号 noise = 0.5*randn(size(t)); % 添加随机噪声 y = x + noise; % 含有噪声的信号 % 卡尔曼滤波参数初始化 Q = 1e-5; % 状态噪声方差 R = 0.01; % 观测噪声方差 x_hat = zeros(size(t)); % 状态估计值 P = zeros(size(t)); % 状态估计误差方差 K = zeros(size(t)); % 卡尔曼增益 % 卡尔曼滤波迭代 for k = 2:length(t) % 预测阶段 x_hat(k) = x_hat(k-1); P(k) = P(k-1) + Q; % 更新阶段 K(k) = P(k) / (P(k) + R); x_hat(k) = x_hat(k) + K(k)*(y(k)-x_hat(k)); P(k) = (1-K(k))*P(k); end % 结果可视化 figure; subplot(2,1,1); plot(t, y); title('含有噪声的信号'); subplot(2,1,2); plot(t, x_hat); title('使用卡尔曼滤波去噪后的信号'); ``` 这段代码生成了一段带噪声的正弦波,并通过卡尔曼滤波将其还原为接近原始形式的平滑曲线。 --- #### 示例三:简单的一维Kalman滤波器 这是一个更简洁的一维Kalman滤波器实现案例[^3]: ```matlab A = 1; % 状态转移矩阵 H = 1; % 测量矩阵 Q = 0.01; % 系统过程噪声的方差 R = 0.1; % 测量噪声的方差 true_state = sin(0.1:0.1:10); % 实际系统状态 measurements = true_state + sqrt(R)*randn(size(true_state)); % 加入测量噪声 filtered_state = zeros(size(true_state)); x_hat = 0; % 初始状态估计 P = 1; % 初始不确定性 for k = 1:length(true_state) % 预测步骤 x_hat_minus = A * x_hat; P_minus = A * P * A' + Q; % 更新步骤 K = P_minus * H' / (H * P_minus * H' + R); x_hat = x_hat_minus + K * (measurements(k) - H * x_hat_minus); P = (1 - K * H) * P_minus; filtered_state(k) = x_hat; end % 绘图显示效果 figure; plot(0.1:0.1:10, true_state, '-g', ... 0.1:0.1:10, measurements, 'or', ... 0.1:0.1:10, filtered_state, '-b'); legend('实际状态', '测量值', '过滤后状态'); xlabel('时间'); ylabel('数值'); title('Kalman滤波器演示'); ``` 该脚本清晰地说明了如何构建一个基本的状态估计框架以及其对应的性能表现。 --- #### 示例四:扩展到多维情况下的Kalman滤波 对于更加复杂的场景,比如线性增长的真实信号加上高斯分布干扰项,则可采用如下方式完成建模与求解[^4]: ```matlab %% 参数配置 N = 200; % 数据长度 t = (1:N); % 时间序列 a = 1; % 状态转移系数 b = 0; % 输入控制作用 c = 1; % 输出映射关系 sigma2 = 10; % 初识协方差 V = 50; % 测量噪声强度 Q = 1; % 转移噪音水平 R = 50; % 测量偏差程度 %% 构造测试集 real_signal = zeros(1,N); % 记录真实的轨迹变化趋势 z = zeros(1,N); % 表达观察得到的具体读数 for i=1:N real_signal(i) = i*2; z(i) = real_signal(i)+normrnd(0,V); end %% 执行核心运算逻辑 x_filter = zeros(1,N); % 收集最终输出结果 K = zeros(1,N); % 动态调整权重因子记录表 x = 5; % 设定初始猜测平均值起点位置 for i=1:N % Prediction Step x_ = a*x+b; sigma2_ = a*sigma2*a'+Q; % Update Step k = sigma2_*c'/(c*sigma2_*c'+R); x = x_+k*(z(i)-c*x_); sigma2=(1-k*c)*sigma2_; % Save Results x_filter(i)=x; K(i)=k; end %% 展示成果对比分析图表 figure; plot(t,K); legend('Kalman Gain'); figure; plot(t,real_signal,'r',t,z,'g',t,x_filter,'b'); legend('Real Signal','Measurement','Filtered Result'); ``` 上述片段不仅实现了基础功能还额外提供了关于增益随时间演化的直观理解视角。 --- ### 总结 以上四个不同复杂度级别的Matlab程序充分展现了Kalman滤波技术的强大之处及其灵活性,在面对各种类型的动态系统的实时监控需求时都能提供良好的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值