- इमेज के आउटलाइन और आकार को संरक्षित रखने वाली ASCII rendering तकनीक विकसित की गई, जिससे पारंपरिक तरीकों में दिखने वाली धुंधली किनारों की समस्या हल हुई
- पिक्सेल-स्तर की साधारण brightness mapping की जगह, हर कैरेक्टर के visual shape को संख्यात्मक रूप से मापकर मैच करने वाला high-dimensional vector-आधारित approach इस्तेमाल किया गया
- हर कैरेक्टर के लिए ऊपर, नीचे, बाएँ, दाएँ क्षेत्रों की density मापकर 2D से 6D तक विस्तारित shape vector बनाया गया, जिससे अधिक सटीक कैरेक्टर चयन संभव हुआ
- boundary की sharpness बढ़ाने के लिए global और directional contrast enhancement algorithms लागू किए गए
- GPU acceleration, caching, और k-d tree search के जरिए real-time ASCII rendering performance हासिल की गई, जिससे high-quality visual effect संभव हुआ
इमेज से ASCII में रूपांतरण
- ASCII में 95 printable characters होते हैं, और monospace font का उपयोग करके इमेज को grid में विभाजित किया जाता है
- हर cell की brightness निकालकर उसे कैरेक्टर density के अनुसार map किया जाता है
- साधारण nearest-neighbor interpolation से boundaries पर असमान jaggies प्रभाव पैदा होता है
- supersampling के जरिए cell के भीतर कई sample लेकर average brightness निकाली जाए तो परिणाम थोड़ा smooth होता है, लेकिन boundaries फिर भी धुंधली रहती हैं
- मूल समस्या यह है कि कैरेक्टर्स को पिक्सेल की तरह माना जाता है, यानी उनकी अपनी visual shape को ध्यान में नहीं रखा जाता
कैरेक्टर shape का उपयोग
- हर कैरेक्टर में cell के भीतर visual density distribution अलग होती है
- उदाहरण:
T ऊपर की ओर भारी होता है, जबकि L नीचे की ओर भारी होता है
- इसे संख्यात्मक रूप देने के लिए cell के भीतर sampling circle रखे जाते हैं, और हर क्षेत्र में कैरेक्टर के occupancy ratio की गणना की जाती है
- ऊपर और नीचे के दो क्षेत्रों की occupancy को vector के रूप में व्यक्त कर 2D shape vector बनाया जाता है
- हर कैरेक्टर का shape vector पहले से compute करके रखा जाता है, और इमेज के sampling vector से Euclidean distance के आधार पर सबसे नज़दीकी कैरेक्टर चुना जाता है
6D shape vector तक विस्तार
- केवल ऊपर-नीचे वाला 2D representation
-, p, q जैसे बीच या बाएँ-दाएँ केंद्रित कैरेक्टर्स को ठीक से व्यक्त नहीं कर पाता
- cell को 6 sampling circles तक बढ़ाकर ऊपर-मध्य-नीचे और बाएँ-दाएँ के अंतर सभी को capture किया जाता है
- 6D shape vector कैरेक्टर के आकार को कहीं अधिक सटीकता से दर्शाता है, और गोल तथा diagonal कैरेक्टर्स को भी अच्छी तरह व्यक्त करता है
- 3D scene rendering में outer outlines तो sharp रहती हैं, लेकिन surfaces के बीच की boundaries धुंधली पड़ने की समस्या सामने आती है
contrast enhancement
- sampling vector के हर तत्व को exponent से adjust किया जाता है, ताकि dark values और dark हों, जबकि bright values बनी रहें
- vector को normalize करने के बाद exponent लागू किया जाता है, फिर उसे वापस मूल range में restore किया जाता है
- इस प्रक्रिया से boundaries का visual separation बेहतर होता है, और कैरेक्टर चयन अधिक स्पष्ट हो जाता है
- एकसमान brightness वाले क्षेत्रों में परिवर्तन बहुत कम होता है, इसलिए smooth gradient बना रहता है
- लेकिन कुछ boundaries पर staircasing प्रभाव दिखाई देता है
directional contrast enhancement
- हर cell के बाहर भी external sampling circles रखे जाते हैं ताकि आसपास की brightness information इकट्ठी की जा सके
- external sampling vector के bright values, internal vector के संबंधित तत्वों को dark की ओर adjust करते हैं, जिससे boundary direction में contrast बढ़ता है
- external sampling को ऊपर-मध्य-नीचे के प्रभाव तक फैलाने पर smooth और sharp boundary representation संभव होती है
- global contrast enhancement के साथ मिलाकर, 3D scenes में स्पष्ट boundaries और बेहतर readability वाली ASCII rendering हासिल की जा सकती है
performance optimization
- कैरेक्टर चुनते समय nearest-neighbor search को सीधे बार-बार दोहराना धीमा पड़ता है, इसलिए multi-dimensional space में तेज़ खोज के लिए k-d tree का उपयोग किया जाता है
- caching के जरिए एक जैसे sampling vectors के परिणाम दोबारा इस्तेमाल किए जाते हैं
- हर vector को 5-bit इकाइयों में quantize करके memory-efficient cache key बनाई जाती है
- range को 8 पर सेट कर quality और memory usage के बीच संतुलन रखा जाता है
- cached lookup बहुत तेज़ होता है, और हज़ारों कैरेक्टर्स को भी real time में process किया जा सकता है
- sampling vector की गणना GPU पर स्थानांतरित कर दी जाती है, जिससे internal/external sampling और contrast enhancement operations shader pipeline में process किए जाते हैं
- CPU की तुलना में कई गुना बेहतर performance
निष्कर्ष
- कैरेक्टर shape को vector के रूप में मापकर उपयोग करने वाला approach ASCII rendering की resolution और sharpness को काफी बढ़ा देता है
- यह तरीका word embedding जैसी अवधारणा से मिलता-जुलता है, और अन्य visual problems में भी लागू हो सकता है
- शुरुआती implementation धीमा था, लेकिन GPU acceleration, caching, और k-d tree search के जरिए mobile पर भी smooth FPS हासिल हुआ
- color-आधारित ASCII representation पर चर्चा नहीं की गई, लेकिन आगे और तरह के shape-contrast संयोजनों पर प्रयोग की संभावना बताई गई
- ASCII rendering केवल एक साधारण visual effect नहीं, बल्कि shape recognition और vector representation की विस्तार-क्षमता दिखाने वाला उदाहरण है
अभी कोई टिप्पणी नहीं है.