surface_params — ROUGHNESS measure op

• 数据种类:depth → table

• 调用: import fullseye as fs; fs.ledger.surface_params(z, dx=1.0, dy=None, assume_filtered=False)(要直接调用实现,import roughness; roughness.surface_params(z, dx=1.0, dy=None, assume_filtered=False);从台账取用则 opsroughness.get("surface_params"))

用法

面粗糙度参数 Sa/Sq/Sp/Sv/Sz/Ssk/Sku/Sdq/Sdr(ISO 25178-2)。

参数

z 经过频带处理的高度场(已去除形状与波纹度)。

dx, dy 采样间隔。dy=None 为正方形像素。

assume_filtered True 时跳过频带检查。默认为 False = 检查。

返回值为 dict。除 9 个参数外,为了用数字留下判断的依据,还放入 band_long_wave_fraction / band_form_ptv_over_sq / n_points / assume_filtered。

★ 为什么默认拒绝(实测)

把 512x512、dx=1 µm 的合成面(自仿射 PSD + 加工纹理 λ=32 µm + 深划痕

4 条 + 波纹度 λ=256 µm + 倾斜 0.050/-0.025)按不同步骤评估。

真值为“划痕、加工纹理与 PSD 在 λc=80 µm 处截止后的结果”:

步骤 Sq Sq 误差 Sa Ssk Sku

原始高度场直接使用 8.3057 +1931.4 % 6.9089 +0.05 2.26

仅去除最小二乘平面 0.7520 +83.9 % 0.5273 -2.04 10.21

平面 + λc=80µm 高通 0.4104 +0.4 % 0.2501 -2.88 18.76

真值 0.4089 — 0.2502 -2.80 18.52

把原始 rms 称为 Sq,会偏大到 20.3 倍。Ssk 从 -2.80 变为 +0.05,连符号都消失了,Sku 从 18.5 变为 2.26(低于高斯的 3)。当波纹度与

倾斜支配分布时,深划痕的信息会消失得无影无踪。

只去除平面仍然偏离 1.8 倍。“哪个参数才安全”这样的

退路并不存在 —— 不声明频带就给出的数字,无法靠参数的

选择来挽救。

★ 检查的内容与阈值的依据(实测)

证据有 2 个。长波长比 = 比评定长度的 1/4 更长的波所占的方差比例。

形状 PTV/Sq = 最小二乘平面本身的高低差除以 rms。

面 长波长比 形状PTV/Sq 判定

原始高度场 0.9714 4.62 拒绝

仅去除最小二乘平面 0.4415 0.00 拒绝

只保留波纹度的面(另一个面) 0.5539 0.15 拒绝

平面 + λc=80µm 高通 0.0086 0.00 通过

真值(λc=80µm) 0.0042 0.00 通过

纯正弦波 λ=32(256 见方) 0.0038 0.03 通过

通过一侧的余量是否无论把 λc 调多高都能保持 —— 确认正当的使用不会被误拒绝更为重要,因此改变 λc 进行了测量

(512²,含加工纹理 + 1 条划痕的面):

λc 16 32 64 80 128 170 256(=L/2)

长波长比 0.0005 0.0011 0.0044 0.0085 0.0306 0.0563 0.1056

即使把 λc 提高到评定长度的一半,也只升到 0.106。

希望拒绝的面中最小为 0.4415。阈值 0.25 放在两者之间(比通过侧高 2.4 倍、

比拒绝侧低 1.8 倍)。形状 PTV/Sq 方面,在经过频带处理的面上

实测只有 0.001~0.03,在残留倾斜的面上为 3.46 / 4.62。

阈值 1.0 位于两者之间(比通过侧高 33 倍、比拒绝侧低 3.5 倍)。

另外这 2 个以 or 判定 —— 没有倾斜但残留波纹度的面

(上表中的“只保留波纹度的面”)不会被形状 PTV 捕获,只有长波长比

会报警。只用其中一个就会留下漏洞。

尽管如此,为了不把判断完全交给机器,可以用 assume_filtered=True

显式关闭(不会悄悄关闭)。证据数值本身也

以 band_long_wave_fraction / band_form_ptv_over_sq 返回。

★ 陷阱 (a) —— Sz 测量的不是“表面的性质”,而是“看了多长”

保持相同的采样间隔(1 µm)只扩大评定窗口,Sz 不会饱和,而是

单调增加(实测,去掉划痕的面):

窗口 32² 64² 128² 256² 512²

窗口数 256 64 16 4 1

Sz平均 0.7112 0.8011 0.8693 0.9248 1.0058

实测/预测 0.5204 0.5295 0.5314 0.5287 0.5420

面积 256 倍时 +41.4 %。预测为高斯极值 2√(2 ln M) · Sq。

比值几乎与窗口无关、基本恒定(0.520~0.542,在均值附近 ±2.0 %),所以

增长的形式(区域的对数)是对的,但绝对值偏离 1.9 倍 ——

因为面存在相关性,独立样本数少于点数 M。

由于不会饱和,“真正的 Sz”并不存在。报告 Sz 时务必附上窗口大小和窗口数。

★ 陷阱 (b) —— 对采样间隔最稳健的不是 Sa,而是 Sq

把同一个面用点采样抽稀,每次用相同步骤(去倾斜 → λc=80 µm 高通)

评估,相对于真值的相对误差(实测):

dx Sa Sq Sz Ssk Sku

1 µm -0.0 % +0.4 % +0.2 % +2.8 % +1.3 %

2 µm -0.1 % +0.4 % -0.2 % +3.0 % +1.4 %

4 µm -0.3 % +0.4 % -1.3 % +3.4 % +1.7 %

8 µm -3.4 % +0.6 % -19.8 % +2.3 % -3.9 %

16 µm +23.5 % +1.6 % -29.1 % -38.4 % -40.8 %

最先超过 10 % 的是 Sz 在 dx=8 µm 时,Sa / Ssk / Sku 在 dx=16 µm 时,

Sq 直到最后都不超过(最大 1.6 %)。Sq 能保住,是因为混叠只是

把能量折回,保持了 2 阶矩。Sa 在分布形状

改变时会变动,Sz 则是由“划痕底部是否恰好落在采样点上”决定的极值。

在 dx=8 µm 时 Sa 以 ±5 % 合格、Sz 不合格 —— 同一份数据,

仅因看的是哪个数字,结论就会反转。

★ 陷阱 (c) —— Sdq / Sdr 同时受采样间隔和单位的影响

Sdq 是梯度的 rms,Sdr 是展开界面面积比 mean(√(1+|∇z|²)) - 1。两者都

用中心差分计算,因此对波长 λ 的正弦,会按 sinc(2 dx/λ) 的量

偏小(实测,λ=32 µm,振幅 1,解析值 Sdq=0.138840):

dx Sdq 实测 实测的误差 sinc(2dx/λ) 的预测

1 µm 0.138471 -0.27 % -0.64 %

2 µm 0.136212 -1.89 % -2.55 %

4 µm 0.126004 -9.25 % -9.97 %

8 µm 0.088388 -36.34 % -36.34 %

测得越粗,面看起来越平滑。 Sdr 本身的形式是对的,

只要测得足够细,就与解析值在 +0.116 % 内一致(以 λ=32、dx=0.25 实测)。

高度与 dx 的单位不同时,只有这里会悄悄出错(Sa/Sq

只使用高度的单位,所以察觉不到)。

边缘的 1 行 1 列为单侧差分,因此不纳入评估。

fail-closed(失败即拒绝)

• 不是 2 维 / 小于 8x8 / 含有 NaN、Inf。

• dx 或 dy 非正、非有限。

• 看起来未经频带处理(assume_filtered=False 时)。

• 所有点高度相同(Sq=0,Ssk/Sku 无法定义)。

详细使用指南

• surface_roughness 族使用指南

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

• 算法的正典(作者、年份)与用途见上面的族使用指南。

可运行的示例(实际调用该算子并已验证的样例)

• poc_polish_wipe_measure — py -3.11 examples/poc_polish_wipe_measure.py

• poc_surface_roughness — py -3.11 examples/poc_surface_roughness.py

类型可衔接的下一个算子(可接受 table 作为输入)

—

同类别(measure)

profile_params · surface_psd


*Provenance: roughness.py — ROUGHNESS 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.