surface_form_remove — ROUGHNESS prepare op

• 資料種類:depth → depth

• 呼叫: import fullseye as fs; fs.ledger.surface_form_remove(z, dx, order=1, method='ls', thresh=None, dy=None, iters=200, seed=0)(要直接呼叫實作,import roughness; roughness.surface_form_remove(z, dx, order=1, method='ls', thresh=None, dy=None, iters=200, seed=0);從台帳取用則 opsroughness.get("surface_form_remove"))

• 經台帳呼叫的回傳值: fullseye.ledger.surface_form_remove(...) 只回傳宣告的 out 型別 depth 的值(底層函式還會回傳輔助資訊)。需要被捨棄的部分時,請用 fullseye.ledger.surface_form_remove.raw(...),或直接呼叫 roughness.surface_form_remove。

• 底層回傳: (residual, coeffs)

用法

直接在網格上去除平面 / 二次曲面。回傳 (residual, coeffs)。

參數

z 高度場。

dx, dy 取樣間隔。dy=None 為正方形像素。

order 1 = 平面,2 = 二次曲面。

method "ls"(最小平方)或 "ransac"(強健)。

thresh RANSAC 的內點閾值(高度單位)。為 None 時使用最小平方殘差的

強健離散度 2.5 x 1.4826 x MAD。

iters RANSAC 的試行次數。由 seed 決定。

coeffs 是以場的中心為原點的物理座標下的單項式係數。order=1 時為 [c0, gx, gy],gx/gy 直接就是梯度; order=2 時為 [c0, gx, gy, cxx, cxy, cyy](依 x^2, xy, y^2 的順序)。

★ 為什麼直接接收網格

現有的 fit_plane / fit_plane_ransac 只接收 (N,3) 點雲。

要傳入 512² 的高度場,每次都得用 column_stack 展開成 262144x3 = 6.3 MB

(實測)。這裡把網格當作網格直接接收,基底也

用 1 維向量的外積建構,因此不需展開。

★ 開銷(實測,1024x1024,iters=200)

method="ls" 47 ms,而 method="ransac" 為 1.8 秒(38 倍)。

RANSAC 每次都要重新統計 1024² 個點的殘差,因此與 iters 成線性關係。

若只看粗糙度,「LS + λc 高通」能以 1/40 的開銷得到相同答案

(見下方實測)—— 這就是不把 RANSAC 設為預設的原因。

★ 陷阱 —— 需要強健性的不是「深刮痕」,而是「寬的離群值」。

但當離群值成為多數時,RANSAC 也會一起失效。

在把 4 條深 3 µm 的刮痕集中在一側的 512x512 面上,只改變刮痕的寬度的

實測(注入並去除 0.050/-0.025 的傾斜。真值是含刮痕的面本身):

刮痕半高半寬 面積比 LS 的 Sq 誤差 RANSAC 的 Sq 誤差 改善

4 µm 5.6 % -1.94 % -0.39 % 5.0 倍

12 µm 16.3 % -6.47 % -3.03 % 2.1 倍

24 µm 31.0 % -13.79 % -11.53 % 1.2 倍

40 µm 46.0 % -23.80 % -23.56 % 1.0 倍

可以讀出 3 點:

• 起作用的不是深度而是面積比。「深刮痕 = 必須強健」是草率的結論,正確的是「寬的離群值 = 必須強健」。

• 誤差必定出現在偏小一側 —— 因為最小平方連「刮痕集中在一側所造成的真實不對稱」也當作平面吸收掉了。在合格判定中會朝危險的方向失效。

• 面積比 46 % 時 RANSAC 也幫不上忙(改善 1.0 倍)。離群值占到近一半時,RANSAC 的多數決本身就會選中刮痕。強健擬合是以「離群值是少數」為前提的工具,該前提失效之處只能用表來呈現。

★ 陷阱 —— 把 λc 放在後級,LS 與 RANSAC 的差就消失了

對同一個面(半高半寬 4 µm)事後套用 λc=80 µm 的高通,

Sq 誤差為 LS +0.00 % / RANSAC -0.00 %(上表中相差 5.0 倍)。

多去除的平面是純粹的長波長,高通只是把同樣的東西再

丟一次而已。擬合的強健性起作用的是不套用 λc 的使用方式(平面度、形狀偏差)時。 若只看粗糙度,靠順序就能挽救。

另外,平面本身的恢復用 LS 也不錯:對上面那個面中注入的梯度

0.050 / -0.025,回傳 0.050006 / -0.025127(實測)。

fail-closed(失敗即拒絕)

• order 不是 1 或 2 / method 不是 "ls"、"ransac"。

• thresh 非正、非有限。

• RANSAC 收集不到規定數量的內點(退化的面)。

詳細使用指南

• 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_pv_thermal_survey — py -3.11 examples/poc_pv_thermal_survey.py

• poc_surface_roughness — py -3.11 examples/poc_surface_roughness.py

型別可銜接的下一個運算子(可接受 depth 作為輸入)

surface_filter · surface_params · surface_psd

同類別(prepare)

surface_filter


*Provenance: roughness.py — ROUGHNESS 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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