1

如何设计一个简单的代码来根据给定的几何散点自动量化二维粗糙表面?例如,要使用数字,r=0 表示光滑表面,r=1 表示非常粗糙的表面,当 0 < r < 1 时,表面介于光滑和粗糙之间。

为了更明确地说明这个问题,下图用于显示几个二维粗糙表面的草图。点是具有给定坐标的散点。因此,可以连接每两个相邻的点,并且可以计算每个段的法线向量(用箭头标记)。我想设计一个类似的功能

def roughness(x, y):

   ...   

   return r

其中xy是每个散点的坐标序列。例如,在情况 (a) 中,x=[0,1,2,3,4,5,6], y=[0,1,0,1,0,1,0]; 在情况 (b), x=[0,1,2,3,4,5], y=[0,0,0,0,0,0]. 当我们调用函数roughness(x, y)时,我们将得到 r=1(非常粗糙)对于 case (a) 和 r=0 (smooth) 对于 case (b)。对于情况(d),可能 r=0.5(中)。问题被细化为我们需要在函数中放置哪些适当的组件roughness

一些初步的想法:

表面的粗糙度是一个局部概念,我们只在特定区域范围内考虑,即只考虑感兴趣位置周围的几个局部点。使用局部法线向量的平均值?这可能会失败:(a)和(b)具有相同的平均值,(0,1),但(a)是粗糙表面,(b)是光滑表面。使用局部法线向量的方差?这也可能失败:(c)和(d)具有相同的方差,但(c)比(d)更粗糙。

2D 粗糙表面草图

4

3 回答 3

1

也许是这样的:

import numpy as np

def roughness(x, y):
    # angles between successive points
    t = np.arctan2(np.diff(y), np.diff(x))

    # differences between angles
    ts = np.sin(t)
    tc = np.cos(t)
    dt = ts[1:] * tc[:-1] - tc[1:] * ts[:-1]

    # sum of squares
    return np.sum(dt**2) / len(dt)

会给你像你问的东西吗?

于 2019-09-18T16:46:04.433 回答
0

许多表面参数的数学定义可以在这里找到,可以很容易地放入numpy:

https://www.keyence.com/ss/products/microscope/roughness/surface/parameters.jsp

图像 (d) 显示了一个挑战:基本上,您希望在进行计算之前将形状展平。这需要事先了解您想要拟合的几何类型。我找到了一个可以在 3D 中执行此操作的应用程序 Gwyddion,但它只能与 Python 2.7 接口,而不是 3。

如果您知道下面是哪个基本形状:

  1. 拟合已知形状
  2. 计算每两点之间的弧距
  3. 通过从原始数据中减去 1) 并根据 2) 分配新坐标来重新映射数字
  4. 执行正常的 2D/3D 粗糙度计算
于 2020-04-10T09:32:32.517 回答
0

也许你应该考虑一个协议定义:

1) 先定义曲面的几何形状

2) 授予该几何表面的内在属性。

2.a) step function can be based on quadratic curve between two peaks or two troughs with their concatenated point as the focus of the 'roughness quadratic' using the slope to define roughness in analogy to the science behind road speed-bumps.
2.b) elliptical objects can be defined by a combination of deformation analysis with centered circles on the incongruity within the body.  This can be solved in many ways analogous to step functions.
2.c) flat lines: select points that deviate from the mean and do a Newtonian around with a window of 5-20 concatenated points or what ever is clever.

3) 定义一个适当的阈值,该阈值适合您定义为“粗糙度”的任何直觉,或根据您的喜好应用任何专业领域的惯例。

这种分支方法可能更快地编程,但我确信这个解决方案可以重构为 3 点椭圆的欧几里得构造,如果有人准备解决几何问题。

于 2019-09-18T13:18:55.293 回答