गणितज्ञ, कोई मोडुलो नहीं!
n = 14627;
length = Ceiling[Log[10, n]];
img = Rasterize[n, RasterSize -> 400, ImageSize -> 400];
box = Rasterize[n, "BoundingBox", RasterSize -> 400, ImageSize -> 400];
width = box[[1]]; height = box[[3]];
ToExpression[
TextRecognize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/length &, {width - width/length, width},
length - 1]]]]
चलो इसे तोड़ दो।
पहले हम संख्या में कितने अंक हैं, यह पता लगाने के लिए कुछ "रचनात्मक अंकगणित" का उपयोग करते हैं: length = Ceiling[Log[10, n]];
अगला, हम एक अच्छी बड़ी छवि के लिए संख्या को व्यवस्थित करते हैं:
अब हम उस छवि के बाउंडिंग बॉक्स के लिए क्वेरी करते हैं, और चौड़ाई और ऊंचाई (वास्तव में छवि ऊंचाई के बजाय बेसलाइन ऑफसेट का उपयोग करके पॉप्युलेट करते हैं, क्योंकि एमएम छवि में आधार रेखा के नीचे कुछ व्हाट्सएप जोड़ता है)।
अगला, NestList एक के बाद एक करके इमेज के अंत से प्लकर के पात्रों को सक्षम करने के लिए स्ट्रिंग की लंबाई से विभाजित छवि की चौड़ाई को घटाता है, और वे इस इमेज के लिए इमेजएम्स् द्वारा पुनः एकत्रित किए जाते हैं:
फिर हम ऑप्टिकल कैरेक्टर रिकग्निशन के लिए TextRecognize फंक्शन पर पास होते हैं, जो इस इमेज साइज और रैस्टिरेशन क्वालिटी पर अंतिम आउटपुट को पहचान कर हमें पूर्णांक देने में सक्षम है:
72641
लॉगरिथम और ओसीआर - यह चॉकलेट और पीनट बटर की तरह है!
नया और बेहतर
यह संस्करण छोटी संख्या के साथ TextRecognize के अड़ियल व्यवहार से निपटने के लिए नंबर को पैड करता है, और फिर अंत में पैड को घटाता है। यह भी एकल अंकों की संख्या के लिए काम करता है!
हालाँकि, आप एक ही नंबर पर रिवर्स रूटीन क्यों चलाएंगे यह मेरे लिए एक रहस्य है। लेकिन सिर्फ पूर्णता के लिए, मैंने इसे शून्य और एक के इनपुट के लिए भी काम किया, जो सामान्य रूप से टूट जाएगा क्योंकि फ्लोर्ड लॉग उनके लिए 1 वापस नहीं करता है।
n = 1;
pad = 94949;
length = If[n == 1 || n == 0, 1, Ceiling[Log[10, n]]];
img = Rasterize[n + (pad*10^length), RasterSize -> 400,
ImageSize -> 400];
padlength = length + 5;
box = ImageDimensions[img];
width = box[[1]]; height = box[[2]];
reversed =
ImageResize[
ImageAssemble[
ImageTake[img, {1, height}, #] & /@
NestList[# - width/padlength &, {width + 1 - width/padlength,
width}, padlength - 1]], 200];
recognized = ToExpression[TextRecognize[reversed]];
(recognized - pad)/10^5