twitter - ट्विटर छवि एन्कोडिंग चुनौती




unicode compression (10)

ठीक है, यहां मेरा है: nanocrunch.cpp और CMakeLists.txt फ़ाइल इसे CMakeLists.txt का उपयोग करके बनाने के लिए CMake. यह मैजिक Magick++ ImageMagick API पर निर्भर करता है, इसकी अधिकांश छवि हैंडलिंग के लिए। इसके लिए स्ट्रिंग एन्कोडिंग के लिए जीगपी लाइब्रेरी के लिए जीगपी लाइब्रेरी भी आवश्यक है।

मैं कुछ अद्वितीय मोड़ के साथ, फ्रैक्टल छवि संपीड़न के अपने समाधान पर आधारित है। मूल विचार छवि को लेना, प्रतिलिपि को 50% तक स्केल करना और विभिन्न उन्मुखताओं में टुकड़ों की तलाश करना है जो मूल छवि में गैर-ओवरलैपिंग ब्लॉक के समान दिखते हैं। यह इस खोज के लिए बहुत क्रूर बल दृष्टिकोण लेता है, लेकिन यह मेरे संशोधनों को पेश करना आसान बनाता है।

पहला संशोधन यह है कि नब्बे डिग्री रोटेशन और फ्लिप को देखने के बजाय, मेरा प्रोग्राम 45 डिग्री उन्मुखता भी मानता है। यह प्रति ब्लॉक एक और बिट है, लेकिन यह छवि की गुणवत्ता में अत्यधिक मदद करता है।

दूसरी बात यह है कि प्रत्येक ब्लॉक के प्रत्येक रंग घटक के लिए एक विपरीत / चमक समायोजन संग्रह करना बहुत महंगा है। इसके बजाए, मैं भारी मात्रा में रंग संग्रहीत करता हूं (पैलेट में केवल 4 * 4 * 4 = 64 रंग होते हैं) जो कुछ अनुपात में मिश्रित हो जाते हैं। गणितीय रूप से, यह प्रत्येक रंग के लिए एक परिवर्तनीय चमक और निरंतर विपरीत समायोजन के बराबर है। दुर्भाग्यवश, इसका मतलब यह भी है कि रंगों को फ़्लिप करने के लिए कोई नकारात्मक विपरीत नहीं है।

एक बार जब यह प्रत्येक ब्लॉक के लिए स्थिति, अभिविन्यास और रंग की गणना करता है, तो यह इसे यूटीएफ -8 स्ट्रिंग में एन्कोड करता है। सबसे पहले, यह ब्लॉक तालिका और छवि आकार में डेटा का प्रतिनिधित्व करने के लिए एक बहुत बड़ा बिग्नम उत्पन्न करता है। इसका दृष्टिकोण सैम होसेवर के समाधान के समान है - एक रेडिक्स के साथ बड़ी संख्या में जो स्थिति के अनुसार भिन्न होता है।

फिर यह उस चरित्र के सेट के आकार के आधार पर परिवर्तित हो जाता है। डिफ़ॉल्ट रूप से, यह असाइन किए गए यूनिकोड चरित्र सेट का पूर्ण उपयोग करता है, कम से कम, एम्पर्सेंड, नियंत्रण, संयोजन, और सरोगेट और निजी वर्णों से कम। यह सुंदर नहीं है लेकिन यह काम करता है। आप डिफ़ॉल्ट तालिका को भी टिप्पणी कर सकते हैं और इसके बजाय प्रिंट करने योग्य 7-बिट ASCII (फिर से <,>, और वर्णों को छोड़कर) या सीजेके एकीकृत विचारधाराओं का चयन कर सकते हैं। कौन से चरित्र कोड उपलब्ध हैं, तालिका को अमान्य और वैध वर्णों के वैकल्पिक रनों के साथ एन्कोडेड रन-लम्बाई संग्रहित किया जाता है।

वैसे भी, यहां कुछ छवियां और समय हैं (जैसा कि मेरे पुराने 3.0GHz पी 4 पर मापा गया है), और ऊपर वर्णित पूर्ण असाइन किए गए यूनिकोड सेट में 140 वर्णों तक संपीड़ित किया गया है। कुल मिलाकर, मैं काफी खुश हूं कि वे सभी कैसे निकले। अगर मेरे पास इस पर काम करने के लिए और अधिक समय था, तो शायद मैं डिकंप्रेस्ड छवियों की अवरोध को कम करने की कोशिश करता हूं। फिर भी, मुझे लगता है कि परिणाम अत्यधिक संपीड़न अनुपात के लिए बहुत अच्छे हैं। डिकंप्रेस्ड छवियां थोड़ा प्रभावशाली हैं, लेकिन मुझे यह देखने में अपेक्षाकृत आसान लगता है कि बिट्स मूल से कैसे मेल खाते हैं।

स्टैक ओवरफ़्लो लोगो (एनकोड करने के लिए 8.6, डीकोड करने के लिए 7.9, 485 बाइट्स):
http://i44.tinypic.com/2w7lok1.png

लेना (एनकोड करने के लिए 32.8, 13.0 से डीकोड करने के लिए, 477 बाइट्स):
http://i42.tinypic.com/2rr49wg.png http://i40.tinypic.com/2rhxxyu.png

मोना लिसा (एनकोड करने के लिए 43.2, 14.5 से डीकोड करने के लिए, 4 9 0 बाइट्स):
http://i41.tinypic.com/ekgwp3.png http://i43.tinypic.com/ngsxep.png

संपादित करें: सीजेके एकीकृत वर्ण

सैम ने सीजेके के साथ इसका इस्तेमाल करने के बारे में टिप्पणियों में पूछा। यहां सीजेके एकीकृत चरित्र सेट से 13 9 वर्णों के लिए संपीड़ित मोना लिसा का एक संस्करण दिया गया है:

http://i43.tinypic.com/2yxgdfk.png咏璘驞凄脒鵚据蛥鸂拗朐朖辿韩瀦魷歪痫栘璯緍脲蕜抱揎頻蓼債鑡嗞靊寞柮嚛嚵籥聚隤 慛 絖 銓 馿 渫 櫰 矍 昀 鰛 掾 撄 粂 敽 牙 稉 擎 蔍 螎 葙 峬 覧 絀 蹔 抆 惫 冧 笻 哜 搀 澐 芯 譶 辍 澮 垝 黟 偞 媄 童 竽 梀 韠 镰 猳 閺 狌 而 羶 喙伆 杇 婣 唆 鐤 諽 鷍 鴞 駫 搶 毤 埙 誖 萜 愿 旖 鞰 萗 勹 鈱 哳 垬 濅 鬒 秀 瞛 洆 认 気 狋 異 闥 籴 珵 仾 氙 熜 謋 繴 茴 晋 髭 杍 嚖 熥 勳 縿 餅 珝 爸擸 萿

इस कार्यक्रम के शीर्ष पर ट्यूनिंग पैरामीटर जिनका उपयोग मैंने किया था: 1 9, 1 9, 4, 4, 3, 10, 11, 1000, 1000. मैंने नंबर_साइंड और कोड की पहली परिभाषा पर भी टिप्पणी की, और असम्बद्ध सीजेके एकीकृत चरित्र सेट का चयन करने के लिए उनकी अंतिम परिभाषाएं।

यदि एक तस्वीर 1000 शब्दों के लायक है, तो 140 वर्णों में आप कितनी तस्वीर फिट कर सकते हैं?

नोट : यह लोग हैं! बाउंटी की समयसीमा यहां है, और कुछ कठिन विचार-विमर्श के बाद, मैंने फैसला किया है कि बोजुम की प्रविष्टि ने शायद हीम होसेवर के बाहर नहीं निकला । एक बार मुझे उन्हें लिखने का मौका मिलने के बाद मैं अधिक विस्तृत नोट्स पोस्ट करूंगा। बेशक, हर किसी को समाधान जमा करना जारी रखना चाहिए और लोगों को वोट देने के लिए समाधान में सुधार करना चाहिए। सबमिट और प्रवेश करने वाले सभी के लिए धन्यवाद; मैंने उन सभी का आनंद लिया। यह मेरे लिए दौड़ने के लिए बहुत मजेदार रहा है, और मुझे आशा है कि यह प्रवेश करने वालों और दर्शकों दोनों के लिए मजेदार रहा है।

मैं ट्विटर पर टिप्पणी में छवियों को संपीड़ित करने की कोशिश करने के बारे में इस दिलचस्प पोस्ट में आया, और उस थ्रेड में बहुत से लोग (और रेडडिट पर एक थ्रेड ) के पास विभिन्न तरीकों के बारे में सुझाव थे जो आप कर सकते थे। इसलिए, मुझे लगता है कि यह एक अच्छा कोडिंग चुनौती देगा; लोगों को अपना पैसा कहां रखें जहां उनका मुंह है, और दिखाएं कि एन्कोडिंग के बारे में उनके विचारों से आपके द्वारा उपलब्ध सीमित स्थान में अधिक जानकारी हो सकती है।

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

यहां परिणाम यह है कि मूल लेखक, Quasimondo को उनके एन्कोडिंग से मिला है (छवि को क्रिएटिव कॉमन्स एट्रिब्यूशन-गैर-वाणिज्यिक लाइसेंस के तहत लाइसेंस प्राप्त है ):

क्या आपके द्वारा बेहतर किया जाना संभव है?

नियम

  1. आपके प्रोग्राम में दो मोड होना चाहिए: एन्कोडिंग और डिकोडिंग
  2. एन्कोडिंग करते समय :
    1. आपके कार्यक्रम को अपनी पसंद के किसी भी उचित रास्टर ग्राफ़िक प्रारूप में ग्राफ़िक इनपुट के रूप में लेना चाहिए। हम कहेंगे कि ImageMagick द्वारा समर्थित कोई रास्टर प्रारूप उचित के रूप में गिना जाता है।
    2. आपके प्रोग्राम को एक संदेश आउटपुट करना होगा जिसे 140 या उससे कम यूनिकोड कोड बिंदुओं में प्रदर्शित किया जा सकता है; गैर-वर्णों ( U+FFFE , U+FFFE , U+ एन FFFE , U+ एन FFFE , जहां U+ 1 - 10 हेक्साडेसिमल है, और श्रेणी U+FDD0 - U+FDEF को छोड़कर U+10FFFF - U+10FFFF श्रेणी में 140 कोड अंक U+FDEF ) और सरोगेट कोड पॉइंट्स ( U+DFFF - U+DFFF )। यह आपकी पसंद के किसी भी उचित एन्कोडिंग में आउटपुट हो सकता है; जीएनयू iconv द्वारा समर्थित किसी भी एन्कोडिंग को उचित माना जाएगा, और आपका प्लेटफार्म देशी एन्कोडिंग या लोकेल एन्कोडिंग एक अच्छा विकल्प होगा। अधिक जानकारी के लिए नीचे यूनिकोड नोट्स देखें।
  3. डीकोडिंग करते समय :
    1. आपके प्रोग्राम को आपके एन्कोडिंग मोड के आउटपुट इनपुट के रूप में लेना चाहिए।
    2. आपके प्रोग्राम को उपरोक्त परिभाषित अनुसार आपकी पसंद के किसी भी उचित प्रारूप में एक छवि को आउटपुट करना होगा, हालांकि आउटपुट वेक्टर प्रारूपों के लिए भी ठीक है।
    3. छवि आउटपुट इनपुट छवि का अनुमान होना चाहिए; जितना करीब आप इनपुट छवि को प्राप्त कर सकते हैं उतना ही बेहतर।
    4. डीकोडिंग प्रक्रिया के ऊपर निर्दिष्ट आउटपुट के अलावा एन्कोडिंग प्रक्रिया के किसी भी अन्य आउटपुट तक पहुंच नहीं हो सकती है; यानी, आप छवि को कहीं भी अपलोड नहीं कर सकते हैं और डीकोडिंग प्रक्रिया को डाउनलोड करने के लिए यूआरएल आउटपुट कर सकते हैं, या उस तरह मूर्खतापूर्ण कुछ भी।
  4. उपयोगकर्ता इंटरफ़ेस में स्थिरता के लिए, आपके प्रोग्राम को निम्नानुसार व्यवहार करना चाहिए:

    1. आपका प्रोग्राम एक स्क्रिप्ट होना चाहिए जिसे उचित दुभाषिया के साथ प्लेटफार्म पर निष्पादन योग्य पर सेट किया जा सकता है, या एक प्रोग्राम जिसे निष्पादन योग्य में संकलित किया जा सकता है।
    2. आपके प्रोग्राम को अपना पहला तर्क लेना चाहिए या तो मोड को सेट करने के लिए encode या decode चाहिए।
    3. आपके प्रोग्राम को निम्न में से एक या अधिक तरीकों से इनपुट लेना चाहिए (यदि आप फ़ाइल नाम लेने वाले व्यक्ति को लागू करते हैं, तो फ़ाइल नाम अनुपलब्ध होने पर आप stdin और stdout से भी पढ़ और लिख सकते हैं):

      1. मानक से इनपुट लें और मानक आउटपुट पर उत्पादन करें।

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
        
      2. दूसरे तर्क में नामित फ़ाइल से इनपुट लें, और तीसरे नाम की फ़ाइल में आउटपुट का उत्पादन करें।

        my-program encode input.png output.txt
        my-program decode output.txt output.png
        
  5. अपने समाधान के लिए, कृपया पोस्ट करें:
    1. आपका कोड, पूर्ण रूप से, और / या इसके लिंक को कहीं और होस्ट किया गया है (यदि यह बहुत लंबा है, या संकलन करने के लिए कई फ़ाइलों की आवश्यकता है, या कुछ)।
    2. यह कैसे काम करता है इसका एक स्पष्टीकरण, यदि यह कोड से तुरंत स्पष्ट नहीं है या यदि कोड लंबा है और लोगों को सारांश में रुचि होगी।
    3. मूल छवि के साथ एक उदाहरण छवि, पाठ जो इसे संपीड़ित करता है, और डीकोडेड छवि।
    4. यदि आप किसी विचार पर निर्माण कर रहे हैं कि किसी और के पास है, तो कृपया उन्हें श्रेय दें। किसी और के विचार को परिष्कृत करने का प्रयास करना ठीक है, लेकिन आपको उन्हें श्रेय देना होगा।

दिशा-निर्देश

ये मूल रूप से नियम हैं जो टूटा, सुझाव, या स्कोरिंग मानदंड हो सकते हैं:

  1. सौंदर्यशास्त्र महत्वपूर्ण हैं। मैं निर्णय लेता हूं, और सुझाव देता हूं कि अन्य लोग इस पर आधारित हैं:
    1. आउटपुट छवि कितनी अच्छी लगती है, और यह मूल की तरह कितनी दिखती है।
    2. पाठ कितना अच्छा लगता है। पूरी तरह से यादृच्छिक gobbledigook ठीक है अगर आपके पास वास्तव में चालाक संपीड़न योजना है, लेकिन मैं उन उत्तरों को भी देखना चाहता हूं जो छवियों को मल्टी-भाषाई कविताओं में बदल दें, या उस तरह कुछ चालाक हो। ध्यान दें कि मूल समाधान के लेखक ने केवल चीनी वर्णों का उपयोग करने का फैसला किया, क्योंकि यह उस तरह से अच्छा दिखता था।
    3. दिलचस्प कोड और चालाक एल्गोरिदम हमेशा अच्छे होते हैं। मुझे संक्षिप्त, बिंदु, और स्पष्ट कोड पसंद है, लेकिन वास्तव में चालाक जटिल एल्गोरिदम ठीक तब तक ठीक हैं जब तक वे अच्छे नतीजे उत्पन्न करते हैं।
  2. गति भी महत्वपूर्ण है, हालांकि यह महत्वपूर्ण नहीं है कि आपके द्वारा की गई छवि को संपीड़ित करने में कितना अच्छा काम है। मेरे पास एक ऐसा प्रोग्राम होगा जो एक छवि को दूसरे के दसवें हिस्से में परिवर्तित कर सकता है जो अंत में दिनों के लिए जेनेटिक एल्गोरिदम चलाएगा।
  3. मैं लंबे समय तक छोटे समाधान पसंद करूंगा, जब तक कि वे गुणवत्ता में उचित रूप से तुलनीय हों; संक्षेप एक पुण्य है।
  4. आपका प्रोग्राम ऐसी भाषा में कार्यान्वित किया जाना चाहिए जिसमें मैक ओएस एक्स, लिनक्स या विंडोज पर एक स्वतंत्र रूप से उपलब्ध कार्यान्वयन हो। मैं प्रोग्राम चलाने में सक्षम होना चाहता हूं, लेकिन यदि आपके पास एक अच्छा समाधान है जो केवल MATLAB या कुछ के अंतर्गत चलता है, तो यह ठीक है।
  5. आपका कार्यक्रम यथासंभव सामान्य होना चाहिए; इसे यथासंभव कई अलग-अलग छवियों के लिए काम करना चाहिए, हालांकि कुछ दूसरों के मुकाबले बेहतर परिणाम दे सकते हैं। विशेष रूप से:
    1. कार्यक्रम में निर्मित कुछ छवियां होने के कारण यह एक संदर्भ से मेल खाता है और लिखता है, और फिर डीकोडिंग पर मिलान करने वाली छवि का उत्पादन करता है, काफी लंगड़ा है और केवल कुछ छवियों को कवर करेगा।
    2. एक कार्यक्रम जो सरल, फ्लैट, ज्यामितीय आकार की छवियों को ले सकता है और उन्हें कुछ वेक्टर आदिम में विघटित कर सकता है, वह बहुत निफ्टी है, लेकिन यदि यह किसी निश्चित जटिलता से परे छवियों में विफल रहता है तो यह शायद अपर्याप्त रूप से सामान्य है।
    3. एक कार्यक्रम जो केवल एक विशेष निश्चित पहलू अनुपात की छवियां ले सकता है लेकिन उनके साथ अच्छा काम भी ठीक होगा, लेकिन आदर्श नहीं होगा।
    4. आप पाएंगे कि एक काले और सफेद छवि रंगीन छवि की तुलना में छोटी जगह में अधिक जानकारी प्राप्त कर सकती है। दूसरी ओर, यह उस छवि के प्रकारों को सीमित कर सकता है जो इसके लिए लागू है; चेहरे काले और सफेद में ठीक हो जाते हैं, लेकिन अमूर्त डिज़ाइन इतनी अच्छी तरह से किराया नहीं दे सकता है।
    5. आउटपुट छवि इनपुट से छोटी है, जबकि यह लगभग समान अनुपात होने पर यह बिल्कुल ठीक है। यह ठीक है अगर आपको छवि को मूल से तुलना करने के लिए स्केल करना है; यह महत्वपूर्ण है कि यह कैसा दिखता है।
  6. आपके कार्यक्रम को आउटपुट का उत्पादन करना चाहिए जो वास्तव में ट्विटर के माध्यम से जा सकता है और बेकार हो सकता है। यह नियम के बजाए केवल एक दिशानिर्देश है, क्योंकि मुझे समर्थित वर्णों के सटीक सेट पर कोई दस्तावेज नहीं मिला, लेकिन आपको शायद नियंत्रण वर्णों, अजीब अदृश्य अक्षरों, निजी उपयोग पात्रों और इसी तरह से बचने चाहिए।

स्कोरिंग रूब्रिक

मेरे स्वीकार्य समाधान को चुनते समय मैं समाधान कैसे रैंकिंग कर सकता हूं, इस बारे में एक सामान्य गाइड के रूप में, मान लें कि मैं शायद 25 बिंदु पैमाने पर समाधान का मूल्यांकन कर रहा हूं (यह बहुत मोटा है, और मैं सीधे कुछ भी स्कोर नहीं करूँगा यह एक बुनियादी दिशानिर्देश के रूप में):

  • एन्कोडिंग योजना कितनी अच्छी तरह से इनपुट छवियों की एक विस्तृत श्रृंखला को पुन: उत्पन्न करता है के लिए 15 अंक । यह एक व्यक्तिपरक, सौंदर्य निर्णय है
    • 0 का मतलब है कि यह बिल्कुल काम नहीं करता है, यह हर बार एक ही छवि देता है, या कुछ
    • 5 का मतलब है कि यह कुछ छवियों को एन्कोड कर सकता है, हालांकि डीकोडेड संस्करण बदसूरत दिखता है और यह अधिक जटिल छवियों पर बिल्कुल काम नहीं कर सकता है
    • 10 का मतलब है कि यह छवियों की एक विस्तृत श्रृंखला पर काम करता है, और सुखद दिखने वाली छवियां उत्पन्न करता है जो कभी-कभी अलग-अलग हो सकते हैं
    • 15 का मतलब है कि यह कुछ छवियों की सही प्रतिकृतियां उत्पन्न करता है, और यहां तक ​​कि बड़ी और अधिक जटिल छवियों के लिए, पहचानने योग्य कुछ देता है। या, शायद यह उन छवियों को नहीं बनाता है जो काफी पहचानने योग्य हैं, लेकिन सुंदर छवियां उत्पन्न करती हैं जो स्पष्ट रूप से मूल से प्राप्त की जाती हैं।
  • यूनिकोड चरित्र सेट के चालाक उपयोग के लिए 3 अंक
    • अनुमत वर्णों के पूरे सेट का उपयोग करने के लिए 0 अंक
    • ट्विटर पर या व्यापक परिस्थितियों में स्थानांतरण के लिए सुरक्षित वर्णों के सीमित सेट का उपयोग करने के लिए 1 बिंदु
    • पात्रों के विषयगत उप-समूह का उपयोग करने के लिए 2 अंक, जैसे केवल हन विचारधारा या केवल दाएं-से-बाएं वर्ण
    • कुछ वाकई साफ करने के लिए 3 अंक, जैसे पठनीय पाठ उत्पन्न करना या प्रश्न में छवि की तरह दिखने वाले वर्णों का उपयोग करना
  • चालाक एल्गोरिदमिक दृष्टिकोण और कोड शैली के लिए 3 अंक
    • कुछ बिंदुओं के लिए 0 अंक जो कोड की 1000 लाइनें हैं, केवल छवि को स्केल करने के लिए, इसे 1 बिट प्रति पिक्सेल के रूप में मानें, और बेस 64 एन्कोड करें
    • मानक एन्कोडिंग तकनीक का उपयोग करने वाली किसी चीज़ के लिए 1 बिंदु और अच्छी तरह लिखित और संक्षिप्त है
    • अपेक्षाकृत उपन्यास एन्कोडिंग तकनीक पेश करने वाले किसी चीज़ के लिए 2 अंक, या यह आश्चर्यजनक रूप से छोटा और साफ है
    • एक लाइनर के लिए 3 अंक जो वास्तव में अच्छे परिणाम उत्पन्न करते हैं, या कुछ ऐसा जो ग्राफिक्स एन्कोडिंग में नई जमीन को तोड़ता है (यदि यह नई जमीन को तोड़ने के लिए कम अंक की तरह लगता है, तो याद रखें कि परिणामस्वरूप इस अच्छे से सौंदर्यशास्त्र के लिए उच्च स्कोर होगा भी)
  • गति के लिए 2 अंक । अन्य सभी बराबर हैं, तेजी से बेहतर है, लेकिन उपर्युक्त मानदंड गति से अधिक महत्वपूर्ण हैं
  • मुक्त (ओपन सोर्स) सॉफ़्टवेयर पर चलने के लिए 1 बिंदु , क्योंकि मैं मुफ्त सॉफ्टवेयर पसंद करता हूं (ध्यान दें कि सी # अभी भी इस बिंदु के लिए योग्य होगा जब तक यह मोनो पर चलता है, वैसे ही MATLAB कोड योग्य होगा यदि यह जीएनयू ऑक्टेव पर चलता है)
  • वास्तव में सभी नियमों का पालन करने के लिए 1 बिंदु । ये नियम थोड़ा बड़ा और जटिल हो गए हैं, इसलिए मैं शायद अन्यथा अच्छे उत्तरों को स्वीकार करूंगा जो एक छोटी सी जानकारी गलत समझते हैं, लेकिन मैं किसी भी समाधान को अतिरिक्त बिंदु दूंगा जो वास्तव में सभी नियमों का पालन करता है

संदर्भ छवियों

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

इनाम

मैं उपरोक्त मानदंडों के आधार पर, 500 रेप बाउंटी (प्लस 50 जो स्टैक ओवरफ्लो किक इन करता है) की पेशकश कर रहा हूं। बेशक, मैं यहां हर किसी को अपने पसंदीदा समाधानों पर वोट देने के लिए प्रोत्साहित करता हूं।

समय सीमा पर नोट करें

यह प्रतियोगिता शनिवार, 30 मई को लगभग 6 बजे तक बकाया होने तक चली जाएगी। मैं यह कह नहीं सकता कि यह सही समय समाप्त होगा; यह 5 से 7 बजे तक कहीं भी हो सकता है। मैं गारंटी दूंगा कि मैं 2 बजे तक प्रस्तुत सभी प्रविष्टियों को देखूंगा, और मैं 4 बजे तक प्रस्तुत सभी प्रविष्टियों को देखने के लिए अपनी पूरी कोशिश करूंगा; अगर उसके बाद समाधान जमा किए जाते हैं, तो मुझे अपना निर्णय लेने से पहले उन्हें उचित दिखने का मौका नहीं मिल सकता है। साथ ही, आपके द्वारा सबमिट किए जाने से पहले, वोटिंग के लिए आपको सबसे अच्छा समाधान चुनने में मदद करने के लिए और अधिक मौका मिलेगा, इसलिए समय सीमा पर सही से पहले प्रयास करें और सबमिट करें।

यूनिकोड नोट्स

यूनिकोड वर्णों की अनुमति के बिल्कुल कुछ भ्रम भी रहा है। संभावित यूनिकोड कोड बिंदुओं की श्रेणी U+10FFFF । कुछ कोड पॉइंट हैं जो डेटा के किसी भी खुले इंटरचेंज में यूनिकोड वर्णों के रूप में उपयोग करने के लिए कभी मान्य नहीं होते हैं; ये noncharacters और सरोगेट कोड अंक हैं । Noncharacters को यूनिडोड मानक 5.1.0 सेक्शन 16.7 में परिभाषित किया गया है जैसे मान U+FFFE , U+FFFE , U+FFFF एन FFFE , U+ एन FFFE जहां एन 1 - 10 हेक्साडेसिमल है, और श्रेणी U+FDD0 - U+FDEF । इन मानों का उपयोग एप्लिकेशन-विशिष्ट आंतरिक उपयोग के लिए किया जाना है, और अनुरूप अनुप्रयोग इन वर्णों को उनके द्वारा संसाधित पाठ से बाहर कर सकते हैं। U+D800 - U+DFFF रूप में यूनिकोड मानक 5.1.0 खंड 3.8 में परिभाषित सरोगेट कोड बिंदु, यूटीएफ -16 में मूल बहुभाषी विमान से परे एन्कोडिंग वर्णों के लिए उपयोग किए जाते हैं; इस प्रकार, यूटीएफ -16 एन्कोडिंग में सीधे इन कोड बिंदुओं का प्रतिनिधित्व करना असंभव है, और किसी अन्य एन्कोडिंग में उन्हें एन्कोड करना अमान्य है। इस प्रकार, इस प्रतियोगिता के प्रयोजन के लिए, मैं किसी भी प्रोग्राम को अनुमति देता हूं जो छवियों को U+10FFFF U+0000 - U+10FFFF से 140 यूनिकोड कोड बिंदुओं के अनुक्रम में एन्कोड करता है, ऊपर वर्णित सभी गैर-चिकित्सकों और सरोगेट जोड़े को छोड़कर।

मैं उन समाधानों को प्राथमिकता दूंगा जो केवल निर्दिष्ट वर्णों का उपयोग करते हैं, और यहां तक ​​कि बेहतर वाले जो निर्दिष्ट वर्णों के चतुर सबसेट का उपयोग करते हैं या उनके द्वारा उपयोग किए जाने वाले चरित्र सेट के साथ कुछ दिलचस्प करते हैं। असाइन किए गए वर्णों की सूची के लिए, यूनिकोड कैरेक्टर डेटाबेस देखें ; ध्यान दें कि कुछ वर्ण सीधे सूचीबद्ध हैं, जबकि कुछ केवल एक श्रेणी की शुरुआत और अंत के रूप में सूचीबद्ध हैं। यह भी ध्यान रखें कि सरोगेट कोड बिंदु डेटाबेस में सूचीबद्ध हैं, लेकिन उपर्युक्त के रूप में निषिद्ध है। यदि आप टेक्स्ट को अधिक रोचक बनाने के लिए वर्णों के कुछ गुणों का लाभ लेना चाहते हैं, तो चरित्र जानकारी के विभिन्न प्रकार उपलब्ध हैं, जैसे कि नामित कोड ब्लॉक और विभिन्न चरित्र गुणों की सूची

चूंकि ट्विटर सटीक चरित्र सेट को निर्दिष्ट नहीं करता है, इसलिए मैं उन समाधानों के बारे में स्पष्ट हूं जो वास्तव में ट्विटर के साथ काम नहीं करते हैं क्योंकि कुछ वर्ण अतिरिक्त या निश्चित वर्णों को अलग करते हैं। इसे प्राथमिकता दी जाती है लेकिन यह आवश्यक नहीं है कि सभी एन्कोडेड आउटपुट को ट्विटर या अन्य माइक्रोब्लॉगिंग सेवा जैसे identi.ca माध्यम से बिना स्थानांतरित किया जा सके। मैंने कुछ दस्तावेज देखे हैं कि ट्विटर इकाई-एन्कोड <,>, और &, और इस प्रकार क्रमशः 4, 4, और 5 वर्णों की गणना करता है, लेकिन मैंने स्वयं को यह परीक्षण नहीं किया है, और उनका जावास्क्रिप्ट चरित्र काउंटर प्रतीत नहीं होता है उन्हें इस तरह गिनने के लिए।

टिप्स और लिंक

  • नियमों में वैध यूनिकोड वर्णों की परिभाषा थोड़ा जटिल है। सीजेके एकीकृत विचारधारा (यू +4 ई00-यू + 9एफसीएफ) जैसे पात्रों का एक एकल ब्लॉक चुनना आसान हो सकता है।
  • आप अपनी छवि मैनिपुलेशन के लिए ImageMagick या पायथन इमेजिंग लाइब्रेरी जैसे मौजूदा छवि पुस्तकालयों का उपयोग कर सकते हैं।
  • यदि आपको यूनिकोड चरित्र सेट और इसके विभिन्न एन्कोडिंग को समझने में कुछ मदद की ज़रूरत है, तो यह त्वरित मार्गदर्शिका या लिनक्स और यूनिक्स में यूटीएफ -8 पर इस विस्तृत FAQ को देखें
  • इससे पहले कि आप अपना समाधान प्राप्त करें, जितना अधिक समय मैं (और अन्य लोगों को मतदान) इसे देखना होगा। यदि आप इसे बेहतर करते हैं तो आप अपना समाधान संपादित कर सकते हैं; जब मैं समाधान के माध्यम से अपना आखिरी रूप लेता हूं तो मैं सबसे हालिया संस्करण पर अपनी बक्षीस का आधार रखूंगा।
  • यदि आप पार्स और लिखने के लिए एक आसान छवि प्रारूप चाहते हैं (और केवल मौजूदा प्रारूप का उपयोग नहीं करना चाहते हैं), तो मैं पीपीएम प्रारूप का उपयोग करने का सुझाव दूंगा । यह एक टेक्स्ट आधारित प्रारूप है जो काम करना बहुत आसान है, और आप इसे और उससे कनवर्ट करने के लिए ImageMagick का उपयोग कर सकते हैं।

मेरा पूरा समाधान पर पाया जा सकता है। इसमें निम्नलिखित विशेषताएं हैं:

  • उचित संपीड़न समय (उच्च गुणवत्ता के लिए लगभग 1 मिनट)
  • फास्ट डिकंप्रेशन (एक सेकंड का अंश)
  • मूल छवि आकार रखता है (केवल पहलू अनुपात नहीं)
  • डीसेंट पुनर्निर्माण गुणवत्ता (आईएमएचओ)
  • संदेश की लंबाई और चरित्र सेट (ASCII, CJK, प्रतीक) रनटाइम पर चुने जा सकते हैं
  • संदेश की लंबाई और चरित्र सेट डिकंप्रेशन समय पर स्वतः खोजे जाते हैं
  • बहुत ही कुशल जानकारी पैकिंग

http://caca.zoy.org/raw-attachment/wiki/img2twit/so-logo.png http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter4.png

蜥 秓 鋖 筷 聝 诿 缰 偺 腶 漷 庯 祩 皙 靊 谪 獜 岨 幻 寤 厎 趆 脘 搇 梄 踥 桻 理 戂 溥 欇 渹 裏 軱 骿 苸 髙 骟 市 簶 璨 粭 浧 鱉 捕 弫 潮 衍 蚙 瀹 岚玧 霫 鏓 蓕 戲 債 鼶 襋 躻 弯 袮 足 庭 侅 旍 凼 飙 驅 據 嘛 掔 倾 诗 籂 阉 嶹 婻 椿 糢 墤 渽 緛 赐 更 儅 棫 武 婩 縑 逡 荨 璙 杯 翉 珸 齸 陁 颗 鳣 憫擲 舥 攩 寉 鈶 兓 庭 璱 篂 鰀 乾 丕 耓 庁 錸 努 樀 肝 亖 弜 喆 蝞 躐 葌 熲 谎 蛪 曟 暙 刍 镶 媏 嘝 驌 慸 盂 氤 缰 殾 譑

एन्कोडिंग प्रक्रिया का एक मोटा अवलोकन यहां दिया गया है:

  • उपलब्ध बिट्स की संख्या वांछित संदेश लंबाई और प्रयोग योग्य वर्णमाला से गणना की जाती है
  • उपलब्ध छवि बिट्स परमिट के रूप में स्रोत छवि को कई वर्ग कोशिकाओं में विभाजित किया गया है
  • शुरुआती निर्देशांक और रंग मानों के साथ प्रत्येक सेल पर निश्चित बिंदुओं (वर्तमान में 2) प्रभावित होते हैं
  • गुणवत्ता की स्थिति पूरी होने तक निम्नलिखित दोहराया जाता है:
    • एक बिंदु एक यादृच्छिक चुना जाता है
    • इस बिंदु पर यादृच्छिक रूप से एक ऑपरेशन किया जाता है (इसे अपने सेल के अंदर ले जाना, उसका रंग बदलना)
    • यदि परिणामस्वरूप छवि (नीचे डीकोडिंग प्रक्रिया देखें) स्रोत छवि के करीब है, तो ऑपरेशन रखा जाता है
  • यूटीएफ -8 में छवि आकार और अंक की सूची एन्कोड की गई है

और यह डीकोडिंग प्रक्रिया है:

  • छवि आकार और अंक यूटीएफ -8 स्ट्रीम से पढ़े जाते हैं
  • गंतव्य छवि में प्रत्येक पिक्सेल के लिए:
    • प्राकृतिक neigbours की सूची गणना की है
    • पिक्सेल का अंतिम रंग अपने प्राकृतिक पड़ोसियों के रंगों के भारित औसत के रूप में सेट किया गया है

मुझे विश्वास है कि कार्यक्रम का सबसे मूल हिस्सा बिटस्ट्रीम है। बिट-गठबंधन मानों को पैक करने के बजाय ( stream <<= shift; stream |= value ), मैं मनमानी मान पैक करता हूं जो दो श्रेणियों ( stream *= range; stream += value ) में नहीं हैं। इसके लिए बिग्नम कंप्यूटेशंस की आवश्यकता है और निश्चित रूप से बहुत धीमी है, लेकिन यह 20902 मुख्य सीजेके पात्रों का उपयोग करते समय मुझे 200 9 .8 बिट्स देता है (यह डेटा में तीन और अंक रख सकता है)। और ASCII का उपयोग करते समय, यह मुझे 840 के बजाय 917.64 बिट्स देता है।

मैंने शुरुआती छवि गणना के लिए एक विधि के खिलाफ निर्णय लिया जिसके लिए भारी हथियार (कोने का पता लगाने, फीचर निष्कर्षण, रंग क्वांटिज़ेशन ...) की आवश्यकता होगी क्योंकि मुझे यकीन नहीं था कि पहले यह वास्तव में मदद करेगा। अब मुझे एहसास है कि अभिसरण धीमा है (1 मिनट स्वीकार्य है लेकिन फिर भी धीमा है) और मैं उस पर सुधार करने की कोशिश कर सकता हूं।

मुख्य फिटिंग लूप डायरेक्ट बाइनरी सीच डाइटिंग एल्गोरिदम से काफी हद तक प्रेरित है (जहां पिक्सल यादृच्छिक रूप से स्वैप किए जाते हैं या एक बेहतर हेलफ़ोन प्राप्त होने तक फ़्लिप किए जाते हैं)। ऊर्जा गणना एक साधारण रूट-माध्य-वर्ग दूरी है, लेकिन मैं पहले मूल छवि पर 5x5 औसत फ़िल्टर करता हूं। एक गॉसियन ब्लर शायद मानव आंखों के व्यवहार का बेहतर प्रतिनिधित्व करेगा, लेकिन मैं तेज किनारों को खोना नहीं चाहता था। मैंने सिमुलेट एनीलिंग या विधियों को ट्यून करने के लिए अन्य मुश्किलों के खिलाफ भी फैसला किया क्योंकि मेरे पास प्रक्रिया को कैलिब्रेट करने के लिए महीनों नहीं हैं। इस प्रकार "गुणवत्ता" झंडा केवल एन्कोडर समाप्त होने से पहले प्रत्येक बिंदु पर किए गए पुनरावृत्तियों की संख्या का प्रतिनिधित्व करता है।

http://caca.zoy.org/raw-attachment/wiki/img2twit/Mona_Lisa_scaled.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter2.png

苉 憗 揣 嶕 繠 剳 腏 篮 濕 茝 霮 墧 蒆 棌 杚 蓳 縳 樟 赒 肴 飗 噹 砃 燋 任 朓 峂 釰 靂 陴 貜 犟 掝 喗 讄 荛 砙 矺 敨 鷾 瓔 亨 髎 芟 氲 簵 鸬 嫤 鉸 俇激 躙 憮 鄴 甮 槺 骳 佛 愚 猪 駪 惾 嫥 綖 珏 矯 坼 堭 颽 箽 赭 飉 訥 偁 箝 窂 蹻 熛 漧 衆 橼 愀 航 玴 毡 裋 頢 羔 恺 墎 嬔 鑹 楄 瑥 鶼 呍 蕖 抲 鸝 秓苾 绒 酯 嵞 脔 婺 污 囉 酼 俵 菛 琪 棺 则 辩 曚 鸸 職 銛 蒝 礭 鱚 蟺 稿 纡 醾 陴 鳣 尥 蟀 惘 鋁 髚 忩 祤 脤 养 趯 沅 况

Even though not all images compress well, I'm surprised by the results and I really wonder what other methods exist that can compress an image to 250 bytes.

I also have small movies of the encoder state's evolution from a random initial state and from a "good" initial state .

Edit : here is how the compression method compares with JPEG. On the left, jamoes's above 536-byte picture. On the right, Mona Lisa compressed down to 534 bytes using the method described here (the bytes mentioned here refer to data bytes, therefore ignoring bits wasted by using Unicode characters):

http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona2.png

Edit : just replaced CJK text with the newest versions of the images.



In the original challenge the size limit is defined as what Twitter still allows you to send if you paste your text in their textbox and press "update". As some people correctly noticed this is different from what you could send as a SMS text message from your mobile.

What is not explictily mentioned (but what my personal rule was) is that you should be able to select the tweeted message in your browser, copy it to the clipboard and paste it into a text input field of your decoder so it can display it. Of course you are also free to save the message as a text file and read it back in or write a tool which accesses the Twitter API and filters out any message that looks like an image code (special markers anyone? wink wink ). But the rule is that the message has to have gone through Twitter before you are allowed to decode it.

Good luck with the 350 bytes - I doubt that you will be able to make use of them.


Posting a Monochrome or Greyscale image should improve the size of the image that can be encoded into that space since you don't care about colour.

Possibly augmenting the challenge to upload three images which when recombined give you a full colour image while still maintaining a monochrome version in each separate image.

Add some compression to the above and It could start looking viable...

Nice!!! Now you guys have piqued my interest. No work will be done for the rest of the day...


Regarding the encoding/decoding part of this challenge. base16b.org is my attempt to specify a standard method for safely and efficiently encoding binary data in the higher Unicode planes.

Some features :

  • Uses only Unicode's Private User Areas
  • Encodes up to 17 bits per character; nearly three times more efficient than Base64
  • A reference Javascript implementation of encode/decode is provided
  • Some sample encodings are included, including Twitter and Wordpress

Sorry, this answer comes way too late for the original competition. I started the project independently of this post, which I discovered half-way into it.


The following is my approach to the problem and I must admit that this was quite an interesting project to work on, it is definitely outside of my normal realm of work and has given me a something new to learn about.

The basic idea behind mine is as follows:

  1. Down-sample the image gray-scale such that there were a total of 16 different shades
  2. Preform RLE on the image
  3. Pack the results into the UTF-16 characters
  4. Preform RLE on the packed results to remove any duplication of characters

It turns out that this does work, but only to a limited extent as you can see from the sample images below. In terms of output, what follows is a sample tweet, specifically for the Lena image shown in the samples.

乤乤万乐唂伂倂倁企儂2企倁3企倁2企伂8企伂3企伂5企倂倃伂倁3企儁企2伂倃5企倁3企倃4企倂企倁企伂2企伂5企倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻 乹Ꮛ靆䍼

As you can see, I did try and constrain the character set a bit; however, I ran into issues doing this when storing the image color data. Also, this encoding scheme also tends to waste a bunch of bits of data that could be used for additional image information.

In terms of run times, for small images the code is extremely fast, about 55ms for the sample images provided, but the time does increase with larger images. For the 512x512 Lena reference image the running time was 1182ms. I should note that the odds are pretty good that the code itself isn't very optimized for performance (eg everything is worked with as a Bitmap ) so the times could go down a bit after some refactoring.

Please feel free to offer me any suggestions on what I could have done better or what might be wrong with the code. The full listing of run times and sample output can be found at the following location: http://code-zen.info/twitterimage/

Update One

I've updated the the RLE code used when compressing the tweet string to do a basic look back and if so so use that for the output. This only works for the number value pairs, but it does save a couple of characters of data. The running time is more or less the same as well as the image quality, but the tweets tend to be a bit smaller. I will update the chart on the website as I complete the testing. What follows is one of the example tweet strings, again for the small version of Lena:

乤乤万乐唂伂倂倁企儂2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グ儁企2伂倃ガ倁ジ倃4企倂企倁企伂ツ伂ス倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷歉䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶殞焻 乹Ꮛ靆䍼

Update Two

Another small update, but I modified the code to pack the color shades into groups of three as opposed to four, this uses some more space, but unless I'm missing something it should mean that "odd" characters no longer appear where the color data is. Also, I updated the compression a bit more so it can now act upon the entire string as opposed to just the color count block. I'm still testing the run times, but they appear to be nominally improved; however, the image quality is still the same. What follows is the newest version of the Lena tweet:

2乤万乐唂伂倂倁企儂2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グ儁企2伂倃ガ倁ジ倃4企倂企倁企伂ツ伂ス倁企伂坹坼坶坻刾啩容力吹婩媷劝圿咶坼妛啭奩嗆婣冷咛啫凃奉佶坍均喳女媗决兴宗喓夽兴唹屹冷圶埫奫唓坤喝奎似商嗉乃

Logo http://code-zen.info/twitterimage/images/-logo.bmp Cornell Box http://code-zen.info/twitterimage/images/cornell-box.bmp Lena http://code-zen.info/twitterimage/images/lena.bmp Mona Lisa http://code-zen.info/twitterimage/images/mona-lisa.bmp


The following isn't a formal submission, since my software hasn't been tailored in any way for the indicated task. DLI can be described as an optimizing general purpose lossy image codec. It's the PSNR and MS-SSIM record holder for image compression, and I thought it would be interesting to see how it performs for this particular task. I used the reference Mona Lisa image provided and scaled it down to 100x150 then used DLI to compress it to 344 bytes.

Mona Lisa DLI http://i40.tinypic.com/2md5q4m.png

For comparison with the JPEG and IMG2TWIT compressed samples, I used DLI to compress the image to 534 bytes as well. The JPEG is 536 bytes and IMG2TWIT is 534 bytes. Images have been scaled up to approximately the same size for easy comparison. JPEG is the left image, IMG2TWIT is center, and DLI is the right image.

Comparison http://i42.tinypic.com/302yjdg.png

The DLI image manages to preserve some of the facial features, most notably the famous smile :).


The idea of storing a bunch of reference images is interesting. Would it be so wrong to store say 25Mb of sample images, and have the encoder try and compose an image using bits of those? With such a minuscule pipe, the machinery at either end is by necessity going to be much greater than the volume of data passing through, so what's the difference between 25Mb of code, and 1Mb of code and 24Mb of image data?

(note the original guidelines ruled out restricting the input to images already in the library - I'm not suggesting that).






compression