measure opdepth → tableimport 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
dx や dy が非正・非有限。assume_filtered=False のとき)。py -3.11 examples/poc_surface_roughness.pytable を入力に取れる)—
measure)Provenance: roughness.py — ROUGHNESS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.