इस थ्रेड में कहीं और, user1149913 महान सलाह (एक संभाव्य मॉडल को परिभाषित करता है) और एक शक्तिशाली दृष्टिकोण (EM अनुमान) के लिए कोड प्रदान करता है। दो मुद्दों पर ध्यान दिया जाना बाकी है:
संभाव्यता मॉडल से प्रस्थान का सामना कैसे करें (जो 2011-2012 के आंकड़ों में बहुत स्पष्ट हैं और कम-ढलान वाले बिंदुओं के अपवाद में स्पष्ट हैं)।
ईएम एल्गोरिथ्म (या किसी अन्य एल्गोरिथ्म) के लिए अच्छे शुरुआती मूल्यों की पहचान कैसे करें।
# 2 को संबोधित करने के लिए, पर्याप्त परिवर्तन का उपयोग करने पर विचार करें । यह एक फीचर-डिटेक्शन एल्गोरिथ्म है, जो सुविधाओं के रैखिक हिस्सों को खोजने के लिए, कुशलतापूर्वक रेडॉन रूपांतरण के रूप में गणना की जा सकती है ।
एक्सyएक्स , वाईHough में परिवर्तन। जब मूल कथानक में सुविधाएँ एक सामान्य रेखा के साथ, या एक से अधिक के पास आती हैं, तो कफ के संग्रह, जो वे हूप ट्रांसफ़ॉर्म में उत्पन्न करते हैं, उस कॉमन लाइन के अनुरूप एक सामान्य चौराहा होता है। होफ ट्रांसफॉर्मेशन में सबसे बड़ी तीव्रता के इन बिंदुओं को पाकर, हम मूल समस्या के अच्छे समाधानों को पढ़ सकते हैं।
इन आंकड़ों के साथ आरंभ करने के लिए, मैंने सबसे पहले सहायक सामग्री (कुल्हाड़ियों, टिक के निशान, और लेबल) को काट दिया और अच्छे उपाय के लिए नीचे दाईं ओर स्पष्ट रूप से बाहर निकलने वाले बिंदुओं को काट दिया और नीचे की धुरी के साथ छिड़का। (जब उस सामान को बाहर नहीं निकाला जाता है, तो प्रक्रिया अभी भी अच्छी तरह से काम करती है, लेकिन यह कुल्हाड़ियों, तख्ते, टिकों के रैखिक अनुक्रम, लेबल के रैखिक अनुक्रम और यहां तक कि नीचे की धुरी पर छिटपुट रूप से पड़े बिंदुओं का भी पता लगाता है!)
img = Import["http://i.stack.imgur.com/SkEm3.png"]
i = ColorNegate[Binarize[img]]
crop2 = ImageCrop[ImageCrop[i, {694, 531}, {Left, Bottom}], {565, 467}, {Right, Top}]
(यह और बाकी कोड गणितज्ञ हैं ।)
इस छवि में प्रत्येक बिंदु के लिए, Hough में घटता की एक संकीर्ण श्रृंखला से मेल खाती है, यहाँ दिखाई दे रही है। वे साइन लहरें हैं:
hough2 = Radon[crop2, Method -> "Hough"] // ImageAdjust
यह नेत्रहीन रूप से उस भावना को प्रकट करता है जिसमें प्रश्न एक लाइन क्लस्टरिंग समस्या है: हूप ट्रांसफ़ॉर्म यह एक बिंदु क्लस्टरिंग समस्या को कम करता है, जिससे हम अपनी पसंद के किसी भी क्लस्टरिंग विधि को लागू कर सकते हैं।
इस मामले में, क्लस्टरिंग इतना स्पष्ट है कि Hough ट्रांसफॉर्म की सरल पोस्ट-प्रोसेसिंग पर्याप्त हो गई है। परिवर्तन में सबसे बड़ी तीव्रता के स्थानों की पहचान करने के लिए, मैंने इसके विपरीत वृद्धि की और लगभग 1% की त्रिज्या में परिवर्तन को धुंधला कर दिया: यह मूल छवि में भूखंड के बिंदुओं के व्यास के बराबर है।
blur = ImageAdjust[Blur[ImageAdjust[hough2, {1, 0}], 8]]
परिणाम थ्रेशहोल्डिंग ने इसे दो छोटे ब्लब्स तक सीमित कर दिया, जिनके केंद्रक यथोचित रूप से सबसे बड़ी तीव्रता के बिंदुओं की पहचान करते हैं: ये अनुमान लगाया लाइनों।
comp = MorphologicalComponents[blur, 0.777]) // Colorize
0.777
छवि के बाईं ओर 0 डिग्री (क्षैतिज) की दिशा से मेल खाती है और, जैसा कि हम बाएं से दाएं देखते हैं, वह कोण रैखिक रूप से 180 डिग्री तक बढ़ जाता है। इंटरपोलिंग, मैं गणना करता हूं कि दो बूँदें क्रमशः 19 और 57.1 डिग्री पर केंद्रित हैं। हम ब्लॉब्स के ऊर्ध्वाधर पदों से इंटरसेप्ट्स भी पढ़ सकते हैं। यह जानकारी प्रारंभिक फिट बैठता है:
width = ImageDimensions[blur][[1]];
slopes = Module[{x, y, z}, ComponentMeasurements[comp, "Centroid"] /.
Rule[x_, {y_, z_}] :> Round[((y - 1/2)/(width - 1)) 180., 0.1]
]
{19., 57.1}
कुछ इसी अंदाज में, इन ढलानों के अनुरूप इंटरसेप्ट्स की गणना की जा सकती है, जिससे ये फिट होते हैं:
(लाल रेखा पिछली तस्वीर में छोटी गुलाबी बिंदु से मेल खाती है और नीली रेखा बड़ी एक्वा बूँद से मेल खाती है।)
बहुत हद तक, इस दृष्टिकोण ने पहले मुद्दे से स्वचालित रूप से निपटा है: रैखिकता से विचलन सबसे बड़ी तीव्रता के बिंदुओं को धब्बा करते हैं, लेकिन आमतौर पर उन्हें ज्यादा स्थानांतरित नहीं करते हैं। स्पष्ट रूप से आउटिंग पॉइंट्स पूरे होफ ट्रांसफॉर्मेशन में निम्न-स्तर के शोर में योगदान करेंगे, जो प्रसंस्करण के बाद की प्रक्रियाओं के दौरान गायब हो जाएगा।
इस बिंदु पर कोई भी इन अनुमानों को ईएम एल्गोरिथ्म के लिए शुरुआती मूल्य या संभावना न्यूनतम के रूप में प्रदान कर सकता है (जो कि अच्छे अनुमान दिए गए हैं, जल्दी से परिवर्तित हो जाएंगे)। हालांकि, बेहतर होगा कि पुनरावृत्त कम से कम वर्गों जैसे एक मजबूत प्रतिगमन अनुमानक का उपयोग करें । यह हर बिंदु पर प्रतिगमन वजन प्रदान करने में सक्षम है । कम वजन इंगित करता है कि एक बिंदु "लाइन" से संबंधित नहीं है। वांछित होने पर, प्रत्येक उचित बिंदु पर अपनी पंक्ति को निर्दिष्ट करने के लिए, इन भारों का अनुसरण करें। फिर, बिंदुओं को वर्गीकृत करते हुए, आप बिंदुओं के दो समूहों पर अलग-अलग साधारण न्यूनतम वर्ग (या किसी अन्य प्रतिगमन प्रक्रिया) का उपयोग कर सकते हैं।