histogram_match — COLORTRANSPORT matching op

• Data kinds: image2d × image2d → image2d

• Call: import fullseye as fs; fs.ledger.histogram_match(src, ref, bins=None, ties='average') (implementation को सीधे call करना हो तो import colortransport; colortransport.histogram_match(src, ref, bins=None, ties='average'), registry से लेना हो तो opscolortransport.get("histogram_match"))

उपयोग

src के मान distribution को ref से मिलाता है (1-D exact optimal transport)।

rank को बनाए रखते हुए मानों को reference के quantiles से बदल देता है। bins देने पर उतने स्तरों वाले cumulative distribution से approximate करता है -- तेज़ है पर exact नहीं रहता, इसलिए default None (exact) रखा गया है।

बराबर मान वाले pixels को कैसे बरता जाए, इससे तस्वीर का अर्थ बदल जाता है। monotone mapping में "बराबर inputs बराबर outputs पर map होते हैं" होना चाहिए, लेकिन सीधे rank से बदलने पर बराबर मान चीर दिए जाते हैं। मापा गया (एक integer image जिसमें मान 2 वाले 4 pixels हैं): output 0.2222 / 0.3333 / 0.4444 / 0.5556 इन 4 मानों में बँट गया। यानी जो क्षेत्र समतल था उसमें मूल तस्वीर में न होने वाले tones उग आते हैं। integer images बराबर मानों से भरी होती हैं, इसलिए यह अपवाद नहीं, सामान्य स्थिति है।

• ties="average" (default) -- बराबर मान वाले pixels को उन पर assign हुए reference मानों का औसत दिया जाता है। बराबर inputs बराबर outputs पर map होते हैं, और monotonicity बनी रहती है। बदले में output distribution reference से ठीक-ठीक मेल नहीं खाता (बराबर मानों के हर गुच्छे जितना, distribution सीढ़ी जैसा गोल हो जाता है)। continuous input (बराबर मान नहीं) पर ठीक मेल बना रहता है।

• ties="break" -- सीधे rank के अनुसार चीर देता है। output distribution reference से ठीक-ठीक मेल खाता है, लेकिन समतल हिस्सों में नकली tones आ जाते हैं। केवल तब जब लक्ष्य distribution का ठीक मेल हो और पता हो कि इसे तस्वीर के रूप में नहीं देखा जाएगा।

किसी को भी चुनें, कुछ खोना पड़ता है (distribution की exactness या समतल हिस्सों का समतलपन), इसलिए चुपचाप एक तय करने के बजाय इसे argument बनाया गया।

multi-channel तस्वीर पर सीधे लगाने से channels के बीच का correlation टूट जाता है। हर axis का marginal distribution मेल खाता है, फिर भी रंगों के संयोजन ऐसे बन सकते हैं जो मूल में नहीं थे। correlation सहित transport करना हो तो color_transfer का method="gaussian"।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• colorimetry — Colorimetry और spectra — रंग केवल spectrum × illuminant × observer से तय होता है

संदर्भ (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 करते हैं)

• color_transport — py -3.11 examples/color_transport.py

• poc_change_detection_misreg — py -3.11 examples/poc_change_detection_misreg.py

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

poisson_blend

इसी category के (matching)

color_transfer · gaussian_transport_map


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

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