You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理XY数据集以生成类似示例蓝线的规则图形?

处理XY数据集生成规则图形的方案

我正在处理XY值数据集,数据存在大量噪声,已经用DBSCAN算法完成降噪。现在需要进一步处理数据,生成类似平滑规则蓝线的目标图形。我试过把DBSCAN和中值滤波器结合,也做过均值处理,相关实现代码如下:

foreach (var item in _cluster.Clusters)
{
    var points_ordered = item.Objects.OrderBy(x => x.Point.X).ThenByDescending(x => x.Point.Y).ToArray();

    var avg_x_point = points_ordered.Sum(x => x.Point.X) / points_ordered.Length;
    var avg_y_point = points_ordered.Sum(x => x.Point.Y) / points_ordered.Length;

    nlist.Add(new R2000ScanPoint
    {
        X = avg_x_point,
        Y = avg_y_point
    });
}

return nlist.ToArray();

可行的改进方法

  • 按X轴局部拟合,替代全局均值:你当前的代码是对整个聚类取平均,直接丢失了X轴的顺序和趋势信息。可以把X轴分成连续的小窗口(比如按固定步长划分区间),每个窗口内的点用线性回归、低阶多项式拟合来计算该区间的Y值,这样能保留整体的曲线趋势。
  • 滑动窗口式的中值/均值滤波:不要对整个聚类做平均,而是对按X排序后的点采用滑动窗口处理。比如每个点取前后N个相邻点的中值作为新Y值,既降噪又能保留局部趋势,比全局均值更适合生成规则线条。
  • 样条插值生成平滑曲线:拿到DBSCAN降噪后按X排序的点集,用三次样条插值生成连续的平滑曲线。这种方法能生成自然流畅的规则线条,完全匹配你要的目标效果。

滑动窗口中值滤波的改进代码示例

// 合并所有聚类的点并按X轴排序
var allFilteredPoints = _cluster.Clusters
    .SelectMany(cluster => cluster.Objects)
    .OrderBy(point => point.Point.X)
    .Select(point => point.Point)
    .ToList();

int windowSize = 5; // 根据数据密度调整窗口大小,奇数更适合取中值
var smoothedPoints = new List<R2000ScanPoint>();

for (int i = 0; i < allFilteredPoints.Count; i++)
{
    // 确定滑动窗口的边界,避免越界
    int startIdx = Math.Max(0, i - windowSize / 2);
    int endIdx = Math.Min(allFilteredPoints.Count - 1, i + windowSize / 2);
    
    // 提取窗口内的Y值并计算中值
    var windowYValues = allFilteredPoints
        .GetRange(startIdx, endIdx - startIdx + 1)
        .Select(p => p.Y)
        .OrderBy(y => y)
        .ToList();
    
    double medianY;
    int midPos = windowYValues.Count / 2;
    if (windowYValues.Count % 2 == 0)
        medianY = (windowYValues[midPos - 1] + windowYValues[midPos]) / 2.0;
    else
        medianY = windowYValues[midPos];
    
    smoothedPoints.Add(new R2000ScanPoint
    {
        X = allFilteredPoints[i].X,
        Y = medianY
    });
}

return smoothedPoints.ToArray();

如果要生成更平滑的连续曲线,可以在上述平滑点的基础上,使用三次样条插值算法,将离散点转换为连续的函数曲线,直接输出规则的线条数据。

内容的提问来源于stack exchange,提问作者edu7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:55:16