针对曲率中的局部抖动进行平滑

news/2024/11/8 17:35:07 标签: 算法, 学习

在计算曲率的过程中,采用平滑函数确实能够有效降低数据的抖动现象。然而,若对整个数据集实施平滑处理,则可能会引发数据失真的问题。

为了最大程度地减少抖动并尽可能确保曲率计算的准确性,我们应当仅针对曲率中的局部抖动进行平滑处理,而非对整个数据集进行平滑。为此,可以考虑采用“自适应平滑”或“局部平滑”的方法,以精准地应对高频噪声点,从而实现更为精确和平滑的曲率计算。

下面是几种实现方式:

一、方法 1:条件平滑

在计算曲率后,可以检测较大变化的位置,仅对这些位置应用平滑。MATLAB中,可以用平滑后的曲率和原曲率的差异来判断哪些位置需要平滑,针对这些位置执行平滑操作。下面是示例代码:

% 设置一个变化阈值,确定哪些点需要平滑
threshold = 0.1; % 你可以根据数据的情况调整这个值

% 计算曲率变化率(差分)
curvature_diff = abs(diff(curvature_spline));

% 找到超过阈值的点位置
smooth_indices = find(curvature_diff > threshold);

% 只对这些点平滑
curvature_spline_smoothed = curvature_spline; % 初始化平滑后的数据

for i = 1:length(smooth_indices)
    idx = smooth_indices(i);
    % 平滑该位置的附近点(以当前点为中心)
    range = max(1, idx-2):min(length(curvature_spline), idx+2);
    curvature_spline_smoothed(range) = smoothdata(curvature_spline(range), 'movmean', 5);
end

二、方法 2:基于分段平滑

可以将曲率分为多个区间,只对高频抖动的区间应用平滑。例如,对于每隔一段距离,检查该段数据的抖动幅度,决定是否需要平滑。

% 设置一个变化阈值,确定哪些点需要平滑
threshold = 0.1; % 你可以根据数据的情况调整这个值
% 将曲率分段,并设置一个分段大小
segment_size = 10; % 这个值可以根据曲率数据长度和实际抖动情况调整

curvature_spline_segmented = curvature_spline; % 初始化分段平滑后的数据

for i = 1:segment_size:length(curvature_spline)
    % 当前段的范围
    segment_range = i:min(i+segment_size-1, length(curvature_spline));
    
    % 检查该段内的抖动情况(标准差)
    if std(curvature_spline(segment_range)) > threshold
        % 只对这个段应用平滑
        curvature_spline_segmented(segment_range) = smoothdata(curvature_spline(segment_range), 'movmean', 5);
    end
end

三、方法 3:手动选择抖动区域平滑

如果已知具体哪些位置需要平滑,可以手动设置平滑范围:

% 手动定义需要平滑的范围
% 使用矩阵定义平滑的开始和结束位置
smooth_ranges = [160, 355;
                 490, 622;
                 835, 1085;
                 1285, 1430;
                 1620, 1780;
                 1975, 2220;
                 2370, 2520];

curvature_spline_manual = curvature_spline; % 初始化

for i = 1:length(smooth_ranges)
    range = smooth_ranges{i};
    curvature_spline_manual(range) = smoothdata(curvature_spline(range), 'movmean', 5);
end

四、方法4:手动选择抖动区域指定固定值

根据第3种方法,也可以不进行数据平滑,而是直接将特定区间设置为一个固定值。代码可以如下:

% 定义区间的开始和结束位置,每行代表一个区间
specified_ranges = [160, 350;
                    500, 620;
                    850, 1085;
                    1285, 1430;
                    1620, 1775;
                    1975, 2220];

% 为每个区间定义不同的固定值
fixed_values = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0]; % 对应于每个区间的固定值

% 遍历每个区间并赋值
for i = 1:size(specified_ranges, 1)
    range = specified_ranges(i, 1):specified_ranges(i, 2); % 取出每一行的区间范围
    curvature_spline(range) = fixed_values(i); % 将该区间设置为对应的固定值
end

五、可视化

最终,可以比较原始曲率和局部平滑后的曲率,以便确认平滑效果。

figure;
plot(1:length(curvature_spline), curvature_spline, 'b-', 'DisplayName', '原始曲率');
hold on;
plot(1:length(curvature_spline_smoothed), curvature_spline_smoothed, 'r--', 'DisplayName', '局部平滑后的曲率');
title('局部平滑后的曲率示意图');
xlabel('虚拟桩序号');
ylabel('曲率');
legend();
grid on;

这样的方法能够有效地保留数据的整体趋势,同时减少局部的抖动。 


http://www.niftyadmin.cn/n/5744220.html

相关文章

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

力扣—不同路径(路径问题的动态规划)

文章目录 题目解析算法原理代码实现题目练习 题目解析 算法原理 状态表示 对于这种「路径类」的问题,我们的状态表示⼀般有两种形式: i. 从[i, j] 位置出发。 ii. 从起始位置出发,到[i, j] 位置。 这⾥选择第⼆种定义状态表⽰的⽅式&#xf…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

SQL相关常见的面试题

SQL(Structured Query Language)是数据库管理中不可或缺的一部分,因此在技术面试中经常会被问到与 SQL 相关的问题。以下是一些常见的 SQL 面试题及其答案。 基础概念 什么是 SQL? SQL 是一种用于管理和处理关系型数据库的标准语…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选

近年来,随着人工智能与大数据技术的迅猛发展,企业的营销手段和策略发生了巨大变化。尤其是在信息爆炸的数字时代,如何有效利用这些技术在海量数据中精准找到潜在客户,已成为中小企业亟待解决的核心问题。 最近,全球人…

JavaFX -- chapter07(HTTP程序设计)

chapter07(HTTP程序设计) 使用Java的Socket类时,你只需要知道服务器的域名(或IP地址)和端口号就可以建立连接。Java的网络库会处理域名解析的过程,即将域名转换为IP地址。 import java.io.*; import java.net.*;public class So…

美国大选——极具典型的可视化案例!GISer学起来

有人说可视化技术有啥意义,不就做个大屏么? 那真的小看了,就如下图这个美国大选来看,这么复杂混乱的信息,可视化技术给你梳理的明明白白的,简单、直观、形象、便于记忆。 让用户能够从繁杂信息中快速抓到重…