speckle_quality — PIV solid op

• Data kinds: image2d → table

• Call: import fullseye as fs; fs.ledger.speckle_quality(img: 'Any') -> 'dict[str, float]' (implementation को सीधे call करना हो तो import dic; dic.speckle_quality(img: 'Any') -> 'dict[str, float]', registry से लेना हो तो opspiv.get("speckle_quality"))

उपयोग

ली गई speckle DIC के लिए उपयुक्त है या नहीं, यह 4 संख्याओं में लौटाता है।

न pivops में है न fullseye में (speckle_filter SAR speckle-noise का निष्कासन है, अलग चीज़)। capture के दौरान मौके पर ही यह आँकने का entry point कि "क्या यह pattern मापा जा सकता है"।

Arguments

img speckle image (2-D)। luminance का scale मायने नहीं रखता, लेकिन coverage

image के भीतर न्यूनतम और अधिकतम पर आधारित सापेक्ष threshold से गिना जाता है।

return value एक dict है:

mig mean intensity gradient sqrt(mean(Ix² + Iy²))।

Pan et al. का DIC quality index। displacement variance की निचली सीमा

σ_noise / (mig √N) से तय होती है, इसलिए यदि यह

छोटा है, तो आप कुछ भी करें, इसे माप नहीं सकते।

grad_rms केवल x दिशा में sqrt(mean(Ix²))।

coverage 0.2*(max-min) + min से अधिक pixels का अनुपात।

mean_blob_diameter_px औसत speckle व्यास [px] का अनुमान (नीचे देखें)।

★ mean_blob_diameter_px एक अनुमान है, माप नहीं

mean घटाई गई image के autocorrelation का radial औसत जिस radius R½ पर 0.5 तक गिरता है, उसे linear

interpolation से निकाला जाता है, और diameter = √2 · R½ लौटाया जाता है। √2 का आधार: 1σ radius r के

यादृच्छिक रूप से बिखरे Gaussian speckles के field के लिए autocorrelation 1σ = r√2 वाला Gaussian है, इसलिए

R½ = 2r√(ln2), जबकि speckle का FWHM 2r√(2ln2) है; अनुपात ठीक √2 है।

दूसरे शब्दों में, यह FWHM से केवल इस मान्यता पर मेल खाता है कि speckles Gaussian हैं और उनकी positions uncorrelated हैं।

मापा गया (बाएँ: analytic speckle, 1σ radius बदला गया और coverage बराबर रखने के लिए संख्या समायोजित की गई।

दाएँ: piv_synth_particles; diameter_px 2σ है, इसलिए FWHM

1.1774 × diameter_px है):

1σ r FWHM est. ratio| d_px FWHM est. ratio cov mig

0.6 1.41 1.36 0.97 | 1.5 1.77 1.80 1.02 0.043 0.1351

1.0 2.35 2.39 1.01 | 2.5 2.94 2.93 1.00 0.106 0.1676

1.6 3.77 3.77 1.00 | 4.0 4.71 4.69 1.00 0.159 0.1775

2.5 5.89 5.77 0.98 | 6.0 7.06 7.01 0.99 0.286 0.1764

4.0 9.42 9.18 0.97 |

Gaussian speckles के लिए 3 % के भीतर। वास्तविक speckle (छपा हुआ, स्प्रे किया हुआ)

Gaussian नहीं होता, इसलिए यह table पुष्टि करती है कि रूपांतरण का अंकगणित सही है;

यह वास्तविक images पर accuracy नहीं है। यह किन कारणों से biased होता है:

• यदि speckle का shape Gaussian नहीं है, तो √2 रूपांतरण स्वयं गलत हो जाता है।

• low-frequency असमानता (illumination gradient) autocorrelation की पूँछ उठा देती है और परिणाम बहुत बड़ा आता है। पहले high-pass filter लगाएँ।

• autocorrelation circular (FFT) है, इसलिए आवधिक background उसे बिगाड़ता है।

• ring की प्रतिनिधि radius ring के भीतर की औसत radius है। bin index का उपयोग करने से विकर्ण √2 radius-1 ring में मिल जाता है, और 1σ=0.6 px पर व्यास 0.80 गुना आया (2 दसवाँ भाग बहुत छोटा)।

★ MIG निचली कट-ऑफ़ का index है, अधिकतम करने वाला objective function नहीं

ऊपर की बाईं table में speckles जितने महीन, mig उतना बढ़ता है (1σ=0.6 पर 0.1127 बनाम

1σ=4.0 पर 0.0384, 2.9 गुना)। फिर भी 1.4 px व्यास वाला speckle under-

sampled है, और examples/poc_dic_strain.py के section 9 के माप में bias और बिखराव दोनों

सबसे खराब हैं। MIG को अधिकतम करने से ऐसा speckle चुना जाता है जिसे मापा नहीं जा सकता।

दाईं table की particle images के लिए यह d=4.0 पर स्थिर हो जाता है और d=6.0 पर थोड़ा गिरता है ——

वही index इनपुट बनाने के तरीके के अनुसार monotonic होता है या नहीं, इसलिए

इसे एक ही तरीके से ली गई images की तुलना के लिए उपयोग करें, absolute value के रूप में नहीं।

★ coverage का threshold Otsu नहीं है

यह fixed threshold 0.2*(max-min) + min है। Otsu bimodal (2 शिखरों वाला) वितरण मानता है, लेकिन

speckles के overlap होने से speckle का intensity वितरण अक्सर unimodal होता है, और Otsu के साथ

threshold हर image में खिसकता है, जिससे तुलना असंभव हो जाती है। fixed threshold कम से कम

समान scale की images की तुलना संभव बनाता है।

★ MIG की इकाई होती है

"luminance / px"। 8-bit integers को ज्यों-का-त्यों पास करने बनाम पहले [0, 1] में normalise करने से

255 गुना का अंतर आता है। इसकी तुलना केवल समान scale की images के बीच की जा सकती है।

fail-closed

• 2-D नहीं / 8x8 से छोटी / NaN / Inf युक्त।

• image पूरी तरह एक समान है (max == min) —— 1 भी speckle नहीं।

• autocorrelation 0.5 से नीचे नहीं गिरता (speckles field of view से बड़े) —— केवल इस स्थिति में mean_blob_diameter_px nan है। बाकी 3 लौटाए जाते हैं।

उपयोग की विस्तृत guide

• piv_displacement family guide

संदर्भ (sample data, साहित्य)

• 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 में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• piv_field_analysis_tour — py -3.11 examples/piv_field_analysis_tour.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

—

इसी category के (solid)

strain_from_displacement · correlation_quality


*Provenance: dic.py — PIV operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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