matlab - 检测均匀表面中的错误点

标签 matlab math error-detection

在我的项目中,我有由算法计算的 20.000 个点的大表面。该算法有时会出现错误,错误地计算小区域内的 1 个或多个点。

这个错误无法在算法中解决,需要事后检测。

错误如下图所示:

enter image description here

正如您所看到的,有一个点计算错误,不仅破坏了完全均匀的表面,而且破坏了情节的美感(这在项目中也很重要。)

有时可以多于一个点,一般不超过5或6个。误差总是Z轴,所以不需要检查X和Y

我一直在绞尽脑汁寻找一个有点“通用”的算法来检测这个点。 我认为也许可以获取表面的补丁并表示 Z,然后检测方差中的点......但我不认为它总是有效。

有什么想法吗?

注意:我不想让别人为我编写代码,只是一个想法。

PD:avobe图像的相关代码:

[x,y] = meshgrid([-2:.07:2]);
Z = x.*exp(-x.^2-y.^2);
subplot(1,2,1)
surf(x,y,Z,gradient(Z))
subplot(1,2,2)
Z(35,35)=Z(35,35)+0.3;
surf(x,y,Z,gradient(Z))

最佳答案

标准技巧是使用拉普拉斯算子,寻找最大的异常值。 (这与 Mohsen 提出的答案没有什么不同,但实际上更容易一些。)您甚至可以使用 conv2 来做到这一点,所以它会非常有效。

我可以提供一些实现这个想法的方法。一个简单的方法是使用我的 gridfit 工具,可以在文件交换中找到。 (Gridfit 本质上使用拉普拉斯算子进行平滑操作。)用包含的所有点拟合曲面,然后查找受拟合扰动最大的单个点。排除它,然后重新运行拟合,再次寻找最大的异常值。 (通过 gridfit,您可以使用权重为点赋予零权重,这是排除点或点列表的简单方法。)当所需的最大扰动足够小时,您可以决定停止该过程。一件好事是 gridfit 还将为异常值估算新值,填补所有漏洞。

第二种方法是直接使用拉普拉斯算子,更多的是一种过滤方法。在这里,您只需计算每个点的值,即左、右、上、下每个邻居的平均值。与其计算平均值最不一致的单个值将被替换为新值。或者,您可以使用新值与旧值的加权平均值。再次迭代,直到该过程不会产生任何大于某个容差的东西。 (这是我从 Fortran IMSL 库中记忆起的旧异常值检测和校正方案的基础,但可能可以追溯到大约 30 年前。)

关于matlab - 检测均匀表面中的错误点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17467893/

相关文章:

matlab - 如何运行多个版本的 MATLAB?

javascript - 滚动到窗口调整大小的最左边的元素 - 怎么样?

java - 修复缺少数字的代码

robustness - 二进制文件格式 : need for error correction?

python - Matlab Engine Python - OSx Anaconda Segfault 或 iPython 的 DYLD_LIBRARY_PATH 错误

arrays - 我可以使用 `sortrows` 的比较函数吗?

matlab - Matlab 图像中对象的边界框

c++ - Raku 中 C++ 和 NativeCall 之间的输出不同

c++ - 根据Fermat的小定理未获得预期的输出

c - 非常短的串行数据包的数据包帧