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 无法定义)。
• 示例数据目录(下载 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)*Provenance: roughness.py — ROUGHNESS 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.