texture op• Data kinds: image → image
• Call: fullseye.apply(img, "local_bimodality", a=0.5, b=0.5) (2-D model = एक image + दो scalar knobs a,b∈[0,1])

*Figure synthetic 128×128 input पर सच में चलाकर मिला output है। बाईं ओर input, दाईं ओर output। Point clouds ऊपर से देखे गए scatter के रूप में (brightness = z), 1-D series line के रूप में, volumes z दिशा में maximum-intensity projection के रूप में, videos बीच के frame के रूप में, complex images amplitude के रूप में, और जो return values चित्र नहीं बन सकते वे स्वयं values के रूप में दिखाए जाते हैं।*
Knob a को बदलकर (0.1 / 0.5 / 0.9, दूसरा knob default पर):
▸ local_bimodality: knob a को बदलने का figure (docs site)
Knob b को बदलकर (0.1 / 0.5 / 0.9, दूसरा knob default पर):
▸ local_bimodality: knob b को बदलने का figure (docs site)
दूसरी images पर भी (synthetic scene / photo / coins। ऊपर की row में inputs, नीचे की row में उनके outputs। Knobs default पर):
▸ local_bimodality: दूसरी images पर output (docs site)
*चौथा column colour (H,W,3) input है। यह op channels को पार किए बिना colour संभालता है (colour channel को तीसरे spatial axis की तरह convolve नहीं करता)।*
Local bimodality (bimodality coefficient)। 1 भी threshold चुने बिना केवल "क्या यहाँ मान 2 हिस्सों में बँटे हैं" को 0 से 1 के map के रूप में लौटाता है।
a window की side length को 9, 15, 25, 41 पर बदलता है (जितना बड़ा, अनुमान उतना stable, लेकिन पतली संरचनाएँ आसपास में घुल जाती हैं)। b contrast floor को max(1e-5, 0.25b x image का value range) पर बदलता है ― यदि window का standard deviation इससे कम हो तो 0 लौटाया जाता है (b=0 पर भी 1e-5 का absolute floor बना रहता है)।
BC = (skewness^2 + 1) / kurtosis, जो window के केवल 1 से 4 order के moment (4 बार box mean) से closed form में निकलता है। यह translation और scale दोनों से invariant है, इसलिए हल्का pattern हो या गहरा pattern, value वही रहती है। reference value analytic solution से तय हैं, और माप भी उन्हीं पर converge करते हैं (window 41):
• 2-point distribution (आधे-आधे 2 value) = 1.0 (kurtosis 1 निचली सीमा है) ― step के ठीक ऊपर मापा गया 1.0000
• uniform distribution = 5/9 = 0.5556 ― uniform random numbers पर मापा गया 0.5598
• normal distribution = 1/3 = 0.3333 ― normal random numbers पर मापा गया 0.3306
> 5/9 "uniform से अधिक नुकीले 2 शिखर" का पारंपरिक मानदंड है। ★एक शिखर होने पर भी यह 0 नहीं होता ― normal distribution का floor 1/3 है, 0 नहीं, इसलिए उपयोग योग्य band 0.33-1.0 है।
स्रोत, और विरासत में मिली सीमाएँ (Pfister, Schwarz, Janczyk, Dale & Freeman 2013, *Frontiers in Psychology* 4:700)। ★तिरछा unimodal distribution false positive देता है: paper के चित्र में स्पष्ट रूप से unimodal distribution का BC = 0.73 और सचमुच bimodal distribution का BC = 0.67 है, यानी क्रम उलट गया है। skewness का absolute value जितना बड़ा हो, शिखरों की संख्या से स्वतंत्र रूप से BC उतना बढ़ता है। इस op में भी यही गुण है — एक ओर पूँछ वाली window (अंधेरी पृष्ठभूमि पर कुछ ही चमकीले बिंदु, आदि) ऊँचा value देती है। bimodality का निर्णय केवल इसी 1 माप से न करें; local_std या otsu की separability के साथ मिलाएँ। ध्यान दें कि paper का formula sample correction सहित (m3^2+1)/(m4 + 3(n-1)^2/((n-2)(n-3))) है, जबकि यह op population version का उपयोग करता है (window में 81 से 1,681 sample होते हैं, इसलिए correction नगण्य है; ऊपर के reference value 1/3, 5/9, 1.0 population version में ठीक-ठीक लागू होते हैं)।
threshold चुनने वाली ओर के generalisation से संबंध: Barron (2020) का Generalized Histogram Thresholding (arXiv:2007.07350) Otsu, Minimum Error Thresholding और weighted percentile threshold को special case के रूप में शामिल करता है और कौन सा threshold चुनें को continuous रूप से interpolate करता है। यह op उसकी जोड़ीदार ओर है:
यह मापता है कि threshold मौजूद भी है या नहीं।
threshold चुनने वाले op (otsu / threshold) से पहले इसकी ज़रूरत क्यों है: binarisation किसी भी image पर उत्तर लौटा देता है, लेकिन केवल 1 शिखर वाली window में यह अर्थहीन position पर काटता है (यह सीमा otsu का docstring खुद स्वीकार करता है)। यह op काटने से पहले "क्या यह बँटता भी है" लौटाता है, इसलिए "जहाँ नहीं बँटता वहाँ न काटें" तय किया जा सकता है। इसका उपयोग यह जाँचने में होता है कि character cell 1 रंग की पृष्ठभूमि पर 1 रंग का अक्षर है या नहीं, plate समान रूप से प्रकाशित है या नहीं, और scratch का gray level सचमुच पृष्ठभूमि से अलग है या नहीं।
★floor अनिवार्य है। uniform सतह पर variance rounding dust बन जाता है, और dust के आपसी 3rd और 4th order के अनुपात संरचना जैसे दिखने लगते हैं ― जिस version में floor को केवल image के value range के सापेक्ष मात्रा से रखा गया था, उसमें केवल 0.5 के एक रंग पर amplitude 1e-12 से 1e-8 का dust रखी गई image पर BC का maximum 1.0000 आया (value range खुद dust है, इसलिए relative floor काम नहीं करता)। absolute floor 1e-5 साथ में रखने पर ही यह 0 पर गिरता है (मापा गया)।
यह normalise नहीं करता (value स्वयं BC है), इसलिए image के बीच तुलना की जा सकती है। किनारा reflect होता है (mode="reflect")। खाली frame पर सब 0। ★window बड़ी है, इसलिए इसे tile में नहीं बाँटना चाहिए (scale.py में कारण सहित registered है)।
• gallery2d_texture_freq 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 में दिए गए हैं।
नीचे का program सच में चलता है, यह जाँचा गया है (figure वाला ही input)। Studio की help में यह block buttons बन जाता है, जिनसे इसे वहीं load करके चलाया जा सकता है।
local_bimodality 0.50 0.50
▸ यह pipeline load करें · Load करके चलाएँ
• gallery2d_texture_freq — py -3.11 examples/gallery2d_texture_freq.py
image को input के रूप में लेते हैं)identity · gaussian · mean_box · bilateral · unsharp · median · min_filter · max_filter
texture)std_filter · local_std · scale_select_std · bootstrap_std_error · structure_tensor_orientation · structure_tensor_coherence · gabor · sk_frangi
*Provenance: ops.py — 2D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.