चंद्रमा के आकार की गणना करें


19

चंद्रमा रहस्य का आकार

मुझे यकीन है कि आपने सुना है कि चंद्रमा अपना आकार बदलता है। जब आप प्यार में होते हैं और आप भाग्यशाली होते हैं, तो चंद्रमा सामान्य स्थितियों की तुलना में आकार में लगभग दोगुना होता है। कुछ लोग कहते हैं कि इसका कारण वातावरण है जो लेंस के रूप में कार्य करता है। दूसरों को लगता है कि यह केवल अन्य वस्तुओं जैसे कि पास के पेड़ की तुलना में मामला है। आप जो भी स्पष्टीकरण पढ़ते हैं, वह काफी व्यक्तिपरक है।

चंद्रमा विज्ञान का आकार

ठीक है, हम प्रोग्रामर हैं, हम नहीं हैं? हम तथ्यों पर भरोसा करते हैं, है ना? तो यहाँ प्रयोग है:

  1. एक अच्छा कैमरा लें जो मैन्युअल रूप से समय और एपर्चर का समर्थन करता है।
  2. अपने कैमरे को अधिकतम ज़ूम स्तर पर सेट करें।
  3. बाहर जाओ, सबसे अच्छी सेटिंग्स का पता लगाने के लिए चंद्रमा की कुछ तस्वीरें लें ताकि चंद्रमा तेज हो और प्रकाश व्यवस्था ठीक हो।
  4. सेटिंग्स याद रखें
  5. हर बार जब आपको लगता है कि चंद्रमा बड़ा या छोटा है, तो उन सेटिंग्स के साथ चंद्रमा की तस्वीरें लें।
  6. पिक्सेल में चंद्रमा के आकार की गणना करें

कैमरा झूठ नहीं होगा, यह होगा? चमकीले पिक्सेल की गिनती करके हम चंद्रमा के आकार को प्रभावी ढंग से माप सकते हैं - कम से कम पिक्सल में।

यदि सभी फ़ोटो में आकार समान है, तो यह हमारे मस्तिष्क में एक बग है। यदि आकार भिन्न होता है, तो अटकल के लिए जगह है

  • चंद्रमा वास्तव में बढ़ता है (लेकिन यह क्या खाता है?)
  • एक वायुमंडलीय लेंस प्रभाव है
  • चंद्रमा के पास एक अण्डाकार वक्र होता है और यह कभी-कभी निकट होता है, कभी-कभी पृथ्वी से दूर होता है
  • ...

लेकिन जब तक आपका काम पूरा नहीं हो जाता, मैं इसे खुला छोड़ दूंगा। बेशक आप पहले से जानना चाहते हैं कि क्या आपका सॉफ्टवेयर चंद्रमा के आकार की सही गणना कर सकता है।

काम

चंद्रमा के कुछ अनुकूलित चित्रों को देखते हुए, कृपया चंद्रमा के आकार की गणना करें। अनुकूलन है: पिक्सेल या तो काले या सफेद होते हैं। बीच में कुछ नहीं। कोई एंटीअलियासिंग नहीं। यह आसान बनाता है, है ना?

चेतावनी: चंद्रमा हमेशा भरा नहीं है, आप जानते हैं ... यह एक दरांती हो सकती है! लेकिन एक दरांती के आकार में भी, चंद्रमा का आकार बड़ा है। तो आप पूर्ण आकार की गणना करेंगे, कृपया।

  • stdinयदि आप प्रोग्राम के बजाय फ़ंक्शन लिखते हैं, तो आपका प्रोग्राम इनपुट के रूप में PNG लेता है, जैसे फ़ाइल नाम कमांड लाइन तर्क, एक बिटमैप ऑब्जेक्ट (मानक फ्रेमवर्क लाइब्रेरी के रूप में)।
  • आपका कार्यक्रम किसी भी उचित इनपुट बिटमैप आकार के साथ काम करता है, जरूरी नहीं कि वर्ग। न्यूनतम चौड़ाई और ऊंचाई 150 पिक्सेल की गारंटी है।
  • पूर्णिमा कम से कम 25% तस्वीर को कवर करती है।
  • आपका प्रोग्राम पिक्सेल में चंद्रमा के परिकलित आकार को आउटपुट करता है जैसे कि यह एक पूर्ण चंद्रमा था।
  • हम मानते हैं कि चंद्रमा एक संपूर्ण क्षेत्र है।
  • सटीक आकार हमेशा एक पूर्णांक संख्या होता है, लेकिन यदि आपकी गणना वापस आती है तो आप एक दशमलव संख्या को आउटपुट कर सकते हैं।
  • सटीकता 98% और 102% के बीच होनी चाहिए। (यह एक अनुमान के बजाय कुछ है जिसे मैं प्राप्त करने की गारंटी दे सकता हूं। यदि आपको लगता है कि यह पहुंचना बहुत कठिन है, तो कृपया एक टिप्पणी छोड़ दें।)

अपडेट :

  • चित्र के बीच में चंद्रमा का केंद्र आवश्यक रूप से नहीं है।
  • न्यूनतम दृश्य क्षेत्र चंद्रमा का 5% या पिक्सेल की कुल संख्या का 1.25% है।
  • तस्वीर इस तरह से ली गई है कि पूरे चंद्रमा की छवि फिट होगी, अर्थात पिक्सेल की कुल संख्या चंद्रमा के आकार के लिए एक ऊपरी सीमा है।
  • चांद की कटाई / कतरन नहीं की जाएगी।

नमूने

आप अपनी खुद की नमूने मिश्रण फ़ाइल का उपयोग कर उत्पन्न कर सकते हैं यदि आप की तरह। मैंने आपके लिए निम्नलिखित चित्र बनाए हैं। आप यह जाँचने के लिए कि क्या छवि में केवल काले और सफ़ेद पिक्सेल हैं और उनमें से कितने हैं, आप WhitePixelCounter.exe ( need .NET) का उपयोग करके PNG फ़ाइल में पिक्सेल की गिनती कर सकते हैं।

निम्नलिखित 256x256 पिक्सेल छवियां सफेद पिक्सेल की मात्रा में भिन्न होती हैं, लेकिन सभी को 16416 पिक्सेल के परिकलित चंद्रमा आकार में परिणाम होना चाहिए।

पूर्णचंद्र चांद चांद चांद चांद चांद

और इन 177x177 पिक्सेल छवियों को 10241 पिक्सेल वापस करना चाहिए। चित्र मूल रूप से समान हैं, लेकिन इस बार एक अलग फोकल लंबाई वाले कैमरे का उपयोग किया गया था।

चांद चांद चांद चांद चांद चांद

9988 के परिणाम के साथ गैर-वर्ग और गैर-केंद्रित नमूने:

एक गैर-चौकोर फ्रेम में चंद्रमा एक गैर-चौकोर फ्रेम में चंद्रमा एक गैर-चौकोर फ्रेम में चंद्रमा एक गैर-चौकोर फ्रेम में चंद्रमा एक गैर-चौकोर फ्रेम में चंद्रमा

ओह, मेरे पास अभी के लिए एक संदर्भ कार्यान्वयन नहीं है और मुझे यह भी नहीं पता है कि मैं कुछ लागू करने में सक्षम हूं या नहीं। लेकिन मेरे मस्तिष्क में एक दृढ़ विश्वास है जो मुझे बताता है कि यह गणितीय रूप से हल होना चाहिए।

नियम

यह कोड गोल्फ है। 2015-03-30 पर सबसे छोटा कोड स्वीकार किया जाता है।


9
सभी उदाहरणों में, चित्र के भीतर चंद्रमा का केंद्र केंद्रित प्रतीत होता है। क्या हम मान सकते हैं कि चंद्रमा हमेशा केंद्रित रहेगा?
डिजिटल ट्रामा

1
क्षेत्र पर +/- 2% की आपकी सटीकता व्यास पर +/- 1% से मेल खाती है: उदाहरण आर = 100 पिक्सेल, क्षेत्र = 10000 * जी; आर = 101 पिक्सेल, क्षेत्र = 10201 * पी। आपकी छोटी छवि में r = 72 है इसलिए d = 144 है इसलिए इसे बस संभव होना चाहिए । डी = 100 से नीचे की छवियों के लिए, मुझे लगता है कि सटीकता को पूरा नहीं किया जा सकता है, हालांकि।
स्तर नदी सेंट

@ डिग्टलट्रूमा: केंद्र को बीच में नहीं होना चाहिए।
थॉमस वेलर

@ मार्टिनबटनर: न्यूनतम दृश्यमान प्रतिशत चंद्रमा का 5% या चित्र का 1,25% है।
थॉमस वेलर

@ मार्टिनबटनर: ठीक है, मैंने प्रश्न को अपडेट किया है, डिफ़ॉल्ट रूप से गैर-वर्ग, गैर-केंद्रित छवियों का उत्पादन करने के लिए मिश्रण फ़ाइल को अपडेट किया है। आप यहां सभी चित्र डाउनलोड कर सकते हैं (* .png.zip) । साथ ही पिक्सेल काउंटर अपडेट किया गया: कुछ और जानकारी आउटपुट करता है और 1.25% नियम की जांच करता है।
थॉमस वेलर

जवाबों:


10

गणितज्ञ 126 119 109 बाइट्स

गणितज्ञ एक छवि में एक घटक के बढ़ाव को माप सकता है। एक पूर्णिमा, पूरी तरह से सममित होने के कारण, 0 से 1 के पैमाने पर, 0 की वृद्धि होती है।

एक छोटा चंद्रमा तेजी से लम्बा हो जाता है, अधिकतम 0.8 तक।

0.998 -0.788 x-0.578 x^2 `लम्बी (क्षेत्र के आधार पर) चंद्रमा की पूर्णता की भविष्यवाणी करने के लिए अनुभवजन्य रूप से निर्धारित मॉडल (बड़ी तस्वीरों के आधार पर) था, इसके बढ़ाव को देखते हुए।

मैंने मॉडल को समायोजित किया 1- 0.788 x -0.578 x^2ताकि शून्य शून्य बढ़ाव (पूर्णिमा) के साथ मॉडल पिक्सेल स्केल फैक्टर के लिए 1 वापस आ जाए। यह 4 बाइट्स बचाता है और अभी भी सटीकता सीमा के भीतर रहता है।

इस मॉडल का उपयोग किसी भी आकार की छवियों के लिए किया जाता है। चंद्रमा की छवि को केंद्रित करने की आवश्यकता नहीं है। इसे फोटो के एक निश्चित अनुपात को कवर करने की भी आवश्यकता नहीं है।

यहां बड़ी छवियों और डेटा को फिट करने के लिए उत्पन्न किए गए पैराबोलिक मॉडल के लिए डेटा बिंदु (बढ़ाव, प्रदर्शितMoonPixels / fullMoonPixels) हैं। रैखिक मॉडल ठीक बैठते हैं, लेकिन द्विघात मॉडल मर चुका है, सीमा के भीतर (नीचे देखें)।

यहां डेटा बड़ी तस्वीरों से हैं। तो मॉडल है

बड़े crescents


नीचे, डेटा (लाल बिंदु) छोटी तस्वीरों से हैं। मॉडल (नीला वक्र) बड़े चित्रों द्वारा उत्पन्न होता है, जो ऊपर प्रदर्शित किया गया है।

सबसे छोटे अर्धचंद्र में 7.5% पूर्णिमा का क्षेत्र है। (बड़ी तस्वीरों में सबसे छोटा वर्धमान पूर्णिमा का 19% है।) यदि द्विघात मॉडल छोटी तस्वीरों पर आधारित होता है, तो नीचे फिट बेहतर होगा, केवल इसलिए कि उसने छोटे वर्धमान को समायोजित किया। एक मजबूत मॉडल, जो कई छोटी-बड़ी crescents सहित स्थितियों की एक विस्तृत श्रृंखला के तहत खड़ा होगा, चित्रों की एक बड़ी विविधता से बेहतर बनाया जाएगा।

फिट की निकटता से पता चलता है कि मॉडल दिए गए चित्रों के लिए हार्ड-कोडेड नहीं था। हम काफी हद तक निश्चित हो सकते हैं कि चंद्रमा का बढ़ाव फोटो के आकार से स्वतंत्र है, जैसा कि कोई उम्मीद करेगा।

छोटे crescents

fछवि लेता है, iइनपुट के रूप में और पिक्सेल में पूर्णिमा के अनुमानित आकार को आउटपुट करता है। यह ऑफ-सेंटर शॉट्स के लिए काम करता है।

जैसा कि नीचे दिए गए आंकड़े बताते हैं, यह एक को छोड़कर सभी परीक्षण मामलों में है। चन्द्रमाओं की व्यवस्था पूर्ण से कमतर होती गई।

i_~c~t_ := Max@ComponentMeasurements[i, t][[All, 2]];
f@i_ := i~c~"Count"/(1 - 0.788 x - 0.578 x^2 /. x -> i~c~"Elongation")

एक तस्वीर में एक से अधिक छवि घटक हो सकते हैं। यहां तक ​​कि दूसरों से अलग एक एकल पिक्सेल को एक अलग घटक माना जाएगा। इस कारण से, "सभी" घटकों की खोज करना आवश्यक है, जिससे कि अधिक से अधिक पिक्सेल की खोज हो सके। (छोटी तस्वीरों में से एक में एक से अधिक छवि घटक हैं।)

बड़े चित्र

बड़ी तस्वीरों से बने चंद्रमा के आकार की भविष्यवाणी समान रूप से सटीक थी।

{"predicted size of full moon", f[#] & /@ large}
{"accuracy", %[[2]]/16416}

{"पूर्णिमा के आकार की भविष्यवाणी की", {16422., 16270.9, 16420.6, 16585.5, 16126.5, 16151.6}}

{"सटीकता", {1.00037, 0.991161, 1.00028, 1.01033, 0.982367, 0.982391}}


छोटी तस्वीरें

छोटी तस्वीरों से बने चंद्रमा के आकार की भविष्यवाणियां समान रूप से, एक महान अपवाद के साथ थीं, अंतिम तस्वीर। मुझे संदेह है कि मुद्दा इस तथ्य से उपजा है कि वर्धमान बहुत संकीर्ण है।

{"predicted sizes of full moon", f[#] & /@ small}
{"accuracy", %[[2]]/10241}

{"मैंने पूर्णिमा के आकार की भविष्यवाणी की है", {10247.3, 10161., 10265.6, 10391., 10058.9, 7045.91}}
{"सटीकता", {1.00061, 0.992192, 1.0024, 1.01465, 0.982221, 0.68801}}


लगता है कि मुझे एक दिन गणितज्ञ को सीखना चाहिए। गोल्फ के बिना इसे हल करने में आपको कितना समय लगा?
थॉमस वेलर

1
@ थोमस डब्ल्यू यह विभिन्न प्रकार की छवि प्रसंस्करण सुविधाओं और अन्य (रैखिक) मॉडल के साथ प्रयोग करने में 2-3 घंटे लेता है जब तक कि मैं आपके द्वारा पोस्ट किए गए ग्राफ़ को प्राप्त नहीं करता। कोडिंग बहुत मुश्किल नहीं थी। और एक ही फ़ंक्शन में अलग-अलग फ़ंक्शन को एकजुट करने के अलावा लगभग कोई गोल्फिंग नहीं है।
डेविड

104:i_~c~t_:=Max[#2&@@@i~ComponentMeasurements~t];f@i_:=i~c~"Count"/(1-0.788x-0.578x^2/.x->i~c~"Elongation")
मार्टिन एंडर

अज्ञात कारणों से, यह #2&@@@सुझाव काम नहीं करता है
डेविड १४'१५

हुह, मैं बाद में देखूंगा। छोटा करने cका दूसरा तरीका हैc=Max@ComponentMeasurements[##][[All,2]]&
मार्टिन एंडर

5

जे, 227 207 बाइट्स (अधिकतम त्रुटि 1.9%)

मेरा मुख्य विचार यह है कि अगर हम चंद्रमा के समोच्च पर 3 अंक पा सकते हैं जो पूर्णिमा के समोच्च पर हैं तो हम इन बिंदुओं की परिधि की गणना कर सकते हैं । वह खतना पूर्णिमा को होगा।

यदि हम अधिकतम दूरी के साथ दो सफेद बिंदु पाते हैं, तो वे हमेशा ऐसे बिंदु होंगे क्योंकि वे पूर्ण चंद्रमा में या तो वास्तविक विकर्ण होंगे या अर्धचंद्राकार होंगे। हम किसी भी ग्राफ में सबसे बड़ी दूरी के साथ बिंदुओं की जोड़ी को किसी भी शुरुआती बिंदु से बिंदु दूर का चयन करके और फिर चयनित से सबसे दूर बिंदु का चयन करके पा सकते हैं।

हम पिछले बिंदुओं से दूरी के उत्पादों के अधिकतम मूल्य के साथ एक तीसरा बिंदु पाते हैं। यह हमेशा समोच्च पर और एक अर्धचंद्र के बाहरी तरफ या एक गिबस के बड़े किनारे पर होगा।

परिधि के व्यास की गणना विपरीत कोण के साइनस द्वारा विभाजित एक तरफ की लंबाई के रूप में की जाती है।

इस विधि की समय-जटिलता इनपुट छवि के आकार में रैखिक है।

कोड

f=.3 :0
load'graphics/png'
i=.readpng y
p=.(,i=_1)#|:,"%.0 1|:,"0/&>/<@i."*$i
s=.%:+/|:*:(-1|.]) (([,],:m@(*&d))(m@d))(m=.p{~(i.>./)@])(d=.+/@:*:@((|:p)-])) 0{p
o.*:-:({.s)%0 o.((+/-2*{.)*:s)%2**/}.s
)

फ़ंक्शन एक स्ट्रिंग के रूप में इनपुट फ़ाइल नाम की अपेक्षा करता है।

(एक (थोड़ा) अधिक पठनीय संस्करण के लिए संशोधन इतिहास की जाँच करें।)

कोड स्पष्टीकरण

  • पी सफेद पिक्सेल निर्देशांक की एक सूची है (भविष्य में अंक कहा जाता है)
  • फ़ंक्शन d, p और तत्वों के बीच की दूरी की गणना करता है
  • s की परिभाषा का दूसरा भाग 3-बिंदु सूची बनाता है:

    • ए सूची में पहले बिंदु से सबसे दूर का बिंदु है
    • B, A से सबसे दूर का बिंदु है
    • C, B से दूरी के समय की दूरी के अधिकतम मान के साथ एक बिंदु है
  • s त्रिभुज ABC की भुजा-लंबाई है

  • अंतिम पंक्ति एबीसी के परिधि के क्षेत्र की गणना करती है जो पूर्णिमा है

परिणाम

सबसे बड़ी त्रुटि 1.9% है।

चित्र उसी क्रम में हैं जैसे प्रश्न में हैं।

Output  Accuracy
----------------
  16407 0.999453 NB. Large images
16375.3 0.997523
16223.9 0.988301
16241.5 0.989369
16262.6 0.990654
16322.1 0.994279
10235.3 0.999445 NB. Small images
10235.3 0.999444
10221.2 0.998067
10220.3 0.997978
  10212 0.997169
10229.6  0.99889
9960.42 0.997239 NB. Offset images
9872.22 0.988408
10161.8   1.0174
9874.95 0.988681
 9805.9 0.981768

भाग लेने और दृष्टिकोण का उल्लेख करने के लिए +1। मुझे खेद है कि मैंने यह निर्दिष्ट नहीं किया कि बीच में केंद्र की आवश्यकता नहीं है। संयोग से नमूना चित्र सभी केंद्रित हैं। वह मेरी गलती है।
थॉमस वेलर

@ThomasW। जब तक मैंने इसे सही नहीं किया, तब तक अपना जवाब अस्थायी रूप से हटा दिया।
बेतरतीब

2

मतलाब 162 156 (वर्तमान त्रुटि मार्जिन में काफी नहीं)

सबसे पहले: सटीकता सभी दो श्रृंखलाओं में से प्रत्येक के लिए 2% से कम है, जहां यह अधिक है (लगभग 5% और 14%)। मेरे दृष्टिकोण को चंद्रमा के दो पिक्सल मिल रहे थे जो एक दूसरे से सबसे दूर हैं, और फिर व्यास के लिए एक अनुमान के रूप में इसका उपयोग कर रहे हैं।

a=imread(input(''));                 %read input image
b=a(:,:,1)>0;                        %binarize red channel
s=size(b);                           %get size of the image
[x,y]=meshgrid(1:s(1),1:s(2));       
z=(x+i*y).*b;z=z(z~=0);              %find the coordinates of all white pixels (as a list)
o=ones(size(z(:)))*z(:)';            
disp(max(max(abs(o-o.').^2))*pi/4);  %calculate the maximum of the distance between each possible pair and evaluate area formula

ये सटीकता के परिणाम हैं (सापेक्ष विचलन 1 - (predicted size / real size))

0.0006 0.0025 0.0169 0.0500 0.0521 0.0113 0.0006 0.0006 0.0026 0.0472 0.1383 0.0131

1

सी # - 617

यह समाधान सभी छवियों के लिए काम नहीं करता है, क्योंकि छवियों में से एक पर, ढलान (एम) अनंत बन जाता है।

सिद्धांत का उल्लेख पहले किया गया था:

  1. अधिकतम दूरी (लाल) के साथ दो बिंदु खोजें
  2. उनके बीच एक रेखा की कल्पना करो (लाल)
  3. मध्य में आयताकार कोण के साथ एक पंक्ति की कल्पना करें (हरा)
  4. ग्रीन लाइन पर सफेद बिंदुओं का पता लगाएं
  5. अन्य बिंदुओं से अधिकतम दूरी के साथ एक का उपयोग करें (हरा)
  6. तीन बिंदुओं से एक वृत्त के क्षेत्रफल की गणना करें

व्याख्या

समस्याग्रस्त मामला यह है, जहां ढलान अनंत है। छवि को 90 ° या कोड में घुमाने से वर्कअराउंड करना संभव है, yइसके बजाय अक्ष पर लूप x

समस्याग्रस्त चंद्रमा

double A(Bitmap b){var a=new List<P>();for(var y=0;y<b.Height;y++)for(var x=0;x<b.Width;x++)if(b.GetPixel(x,y).R>0)a.Add(new P{x=x,y=y});double c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,n=double.MaxValue;foreach(var h in a)foreach(var i in a){var t=Math.Sqrt(Math.Pow(h.x-i.x,2)+Math.Pow(h.y-i.y,2));if(t>c){d=h.x;f=i.x;e=h.y;g=i.y;c=t;}}c=(f-d)/(e-g);for(int x=0;x<b.Width;x++){int y=(int)(c*x+((e+g)/2-c*(d+f)/2));if(y>=0&&y<b.Height&&b.GetPixel(x,y).R>0){var s=(g-e)/(f-d);var q=(y-g)/(x-f);var j=(s*q*(e-y)+q*(d+f)-s*(f+x))/(2*(q-s));var k=-(j-(d+f)/2)/s+(e+g)/2;var l=(j-d)*(j-d)+(k-e)*(k-e);if(l<n)n=l;}}return Math.PI*n;}

न्यूनतम सटीकता है

  • 256 पिक्सेल छवियों के लिए +89%
  • -07% 177 पिक्सेल छवियों के लिए
  • गैर-वर्ग छवियों के लिए -1.66%
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.