measure op• Data kinds: depth → table
• Call: import fullseye as fs; fs.ledger.surface_params(z, dx=1.0, dy=None, assume_filtered=False) (implementation को सीधे call करना हो तो import roughness; roughness.surface_params(z, dx=1.0, dy=None, assume_filtered=False), registry से लेना हो तो opsroughness.get("surface_params"))
सतह के roughness parameter Sa/Sq/Sp/Sv/Sz/Ssk/Sku/Sdq/Sdr (ISO 25178-2)।
Arguments
z band-processed height field (form और waviness हटाए गए)।
dx, dy sampling intervals। dy=None का अर्थ square pixels।
assume_filtered True band check को छोड़ देता है। Default False = check है।
एक dict लौटाता है। 9 parameters के अलावा, निर्णय का आधार संख्याओं के रूप में रखने के लिए, इसमें band_long_wave_fraction / band_form_ptv_over_sq / n_points / assume_filtered भी होते हैं।
★ यह default में reject क्यों करता है (measured)
एक synthetic 512x512, dx=1 µm surface (self-affine PSD + machining marks λ=32 µm + गहरी scratches
x4 + waviness λ=256 µm + tilt 0.050/-0.025), अलग-अलग procedures से evaluate की गई।
Ground truth है "λc=80 µm पर काटे गए scratches, machining marks और PSD":
procedure Sq Sq error Sa Ssk Sku
raw height field as is 8.3057 +1931.4 % 6.9089 +0.05 2.26
least-squares plane removed 0.7520 +83.9 % 0.5273 -2.04 10.21
plane + λc=80µm high-pass 0.4104 +0.4 % 0.2501 -2.88 18.76
ground truth 0.4089 — 0.2502 -2.80 18.52
Raw rms को Sq कहने पर 20.3 गुना मिलता है। Ssk -2.80 से +0.05 हो जाता है, यहाँ तक कि अपना sign भी खो देता है, और Sku 18.5 से 2.26 हो जाता है (Gaussian के 3 से नीचे)। जब waviness और
tilt distribution पर हावी होते हैं, तो गहरी scratches की जानकारी बिना निशान के गायब हो जाती है।
केवल plane हटाने पर भी यह 1.8 गुना गलत रहता है। "कौन सा parameter
सुरक्षित है" जैसा कोई बच निकलने का रास्ता नहीं है — band घोषित किए बिना बनी संख्याओं को parameter के चुनाव से
बचाया नहीं जा सकता।
★ Check क्या करता है, और thresholds का आधार (measured)
2 सबूत। Long-wave fraction = evaluation length के 1/4 से लंबी waves द्वारा उठाया गया variance का हिस्सा।
Form PTV/Sq = least-squares plane के खुद के peak-to-valley को rms से भाग।
surface long-wave form PTV/Sq verdict
raw height field 0.9714 4.62 reject
least-squares plane removed only 0.4415 0.00 reject
waviness only left (another surface) 0.5539 0.15 reject
plane + λc=80µm high-pass 0.0086 0.00 pass
ground truth (λc=80µm) 0.0042 0.00 pass
pure sine λ=32 (256 square) 0.0038 0.03 pass
क्या pass की ओर का margin λc को कितना भी बढ़ाने पर टिका रहता है? — यह पुष्टि करना कि वैध इस्तेमाल गलती से reject नहीं होता ज़्यादा महत्वपूर्ण है, इसलिए λc बदलकर मापा गया
(512², machining marks + 1 scratch वाली surface):
λc 16 32 64 80 128 170 256(=L/2)
long-wave 0.0005 0.0011 0.0044 0.0085 0.0306 0.0563 0.1056
λc को evaluation length के आधे तक बढ़ाने पर भी यह केवल 0.106 तक बढ़ता है।
Reject होने वाली सबसे छोटी surface 0.4415 पर है। Threshold 0.25 इनके बीच रखा गया है (pass की ओर से 2.4 गुना ऊपर,
reject की ओर से 1.8 गुना नीचे)। Form PTV/Sq, अपनी ओर से, band-processed surfaces पर
measured केवल 0.001 से 0.03 है, और tilt बचे surfaces पर 3.46 / 4.62 है।
Threshold 1.0 बीच में है (pass की ओर से 33 गुना ऊपर, reject की ओर से 3.5 गुना नीचे)।
ये 2 or से जोड़े जाते हैं — tilt रहित लेकिन waviness बची surface
(ऊपर की table में "waviness only left") form PTV से नहीं पकड़ी जाती; केवल long-wave fraction
trigger होता है। किसी एक को अकेले रखने से छेद बचता है।
फिर भी, निर्णय पूरी तरह मशीन को न सौंपने के लिए, इसे assume_filtered=True से स्पष्ट रूप से बंद किया जा सकता है
(यह कभी चुपचाप बंद नहीं होता)। सबूत के मान खुद भी
band_long_wave_fraction / band_form_ptv_over_sq के रूप में लौटाए जाते हैं।
★ गड्ढा (a) — Sz "surface का गुण" नहीं बल्कि "आपने कितनी देर देखा" मापता है
समान sampling interval (1 µm) रखकर केवल evaluation window चौड़ा करने पर, Sz स्थिर नहीं होता बल्कि
monotonically बढ़ता है (measured, scratches हटाई गई surface):
window 32² 64² 128² 256² 512²
windows 256 64 16 4 1
mean Sz 0.7112 0.8011 0.8693 0.9248 1.0058
meas/pred 0.5204 0.5295 0.5314 0.5287 0.5420
256 गुना area पर +41.4 %। Prediction Gaussian extreme value 2√(2 ln M) · Sq है।
Ratio window से लगभग स्वतंत्र स्थिर रहता है (0.520 से 0.542, mean के आसपास ±2.0 %), इसलिए
वृद्धि का आकार (area का logarithm) सही है, लेकिन absolute value 1.9 गुना गलत है —
क्योंकि surface correlated है और independent samples की संख्या point count M से कम है।
चूँकि यह कभी स्थिर नहीं होता, कोई "true Sz" मौजूद नहीं है। Sz report करते समय हमेशा window size और windows की संख्या बताएँ।
★ गड्ढा (b) — sampling interval के प्रति सबसे robust Sa नहीं बल्कि Sq है
वही surface point sampling से decimate की गई और हर बार समान procedure (tilt हटाना → λc=80 µm high-pass) से evaluate की गई;
ground truth के मुकाबले relative error (measured):
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 % से सबसे पहले dx=8 µm पर Sz आगे निकलता है, फिर dx=16 µm पर Sa / Ssk / Sku;
Sq कभी आगे नहीं निकलता (अधिकतम 1.6 %)। Sq इसलिए बचता है क्योंकि aliasing
केवल energy को वापस मोड़ता है और 2nd moment को सुरक्षित रखता है। Distribution का आकार बदलने पर Sa
हिलता है, और Sz एक extreme value है जो "scratch का तल संयोग से sample point पर पड़ता है या नहीं" से तय होता है।
dx=8 µm पर, ±5 % पर Sa pass होता है जबकि Sz fail — समान data पर,
निष्कर्ष केवल इस पर पलट जाता है कि आपने कौन सी संख्या देखी।
★ गड्ढा (c) — Sdq / Sdr पर sampling interval और units दोनों का असर पड़ता है
Sdq gradient का rms है, Sdr developed interfacial area ratio mean(√(1+|∇z|²)) - 1। दोनों
central differences से गणना होते हैं, इसलिए wavelength λ की sine के लिए ये factor sinc(2 dx/λ) से
बहुत कम आते हैं (measured, λ=32 µm, amplitude 1, analytic Sdq=0.138840):
dx Sdq measured measured error sinc(2dx/λ) prediction
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 %
जितना मोटा मापेंगे, surface उतनी smooth दिखेगी। Sdr का अपना रूप सही है,
और पर्याप्त बारीक sampling पर यह analytic value से +0.116 % के अंदर मेल खाता है (λ=32, dx=0.25 से measured)।
अगर height और dx की units अलग हैं, तो केवल यही चुपचाप टूटता है (Sa/Sq
केवल height unit इस्तेमाल करते हैं, इसलिए आपको पता नहीं चल सकता)।
सबसे बाहरी 1 row और 1 column one-sided differences इस्तेमाल करते हैं, इसलिए वे evaluation से बाहर रखे जाते हैं।
fail-closed
• 2-D नहीं / 8x8 से छोटा / NaN या Inf शामिल।
• dx या dy धनात्मक नहीं या finite नहीं।
• band-processed नहीं दिखता (जब assume_filtered=False हो)।
• सभी points समान ऊँचाई पर (Sq=0, इसलिए Ssk/Sku undefined हैं)।
• surface_roughness family guide
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• 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 को input के रूप में लेते हैं)—
measure)*Provenance: roughness.py — ROUGHNESS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.