arrays लाखों पिक्सेल के साथ 2 डी, अनबॉक्स किए गए पिक्सेल सरणी के लिए हास्केल प्रतिनिधित्व की क्या सिफारिश की जाती है?




haskell image-processing (4)

मैं हास्केल में कुछ छवि-प्रोसेसिंग समस्याओं से निपटना चाहता हूं। मैं लाखों पिक्सल के साथ दोनों बिटोनल (बिटमैप) और रंगीन छवियों के साथ काम कर रहा हूं। मेरे पास कई प्रश्न हैं:

  1. Vector.Unboxed बीच किस आधार पर चयन करना चाहिए। Vector.Unboxed और UArray ? वे दोनों अनबॉक्स किए गए सरणी हैं, लेकिन Vector अबास्ट्रक्शन भारी विज्ञापन दिखाता है, विशेष रूप से लूप संलयन के आसपास। Vector हमेशा बेहतर है? यदि नहीं, तो मुझे किस प्रतिनिधित्व का उपयोग करना चाहिए?

  2. रंगीन छवियों के लिए मैं 16-बिट पूर्णांक के ट्रिपल या एकल-परिशुद्धता फ़्लोटिंग-पॉइंट संख्याओं के ट्रिपल स्टोर करना चाहता हूं। इस उद्देश्य के लिए, या तो Vector या UArray उपयोग करने में आसान है? अधिक कलाकार?

  3. बिटोनल छवियों के लिए मुझे केवल 1 बिट प्रति पिक्सल स्टोर करने की आवश्यकता होगी। क्या कोई पूर्वनिर्धारित डेटाटाइप है जो मुझे एक शब्द में एकाधिक पिक्सेल पैक करके यहां मदद कर सकता है, या मैं खुद ही हूं?

  4. अंत में, मेरे सरणी द्वि-आयामी हैं। मुझे लगता है कि मैं "एरे की सरणी" (या वेक्टरों के वेक्टर) के रूप में प्रतिनिधित्व द्वारा लगाए गए अतिरिक्त संकेत से निपट सकता हूं, लेकिन मैं एक अमूर्त पसंद करूंगा जिसमें इंडेक्स-मैपिंग समर्थन हो। क्या कोई मानक लाइब्रेरी से या हैकेज से कुछ भी सुझा सकता है?

मैं एक कार्यात्मक प्रोग्रामर हूं और उत्परिवर्तन की कोई आवश्यकता नहीं है :-)


बहु-आयामी सरणी के लिए, मेरे विचार में, हास्केल में वर्तमान सर्वोत्तम विकल्प, repa

रेपा उच्च प्रदर्शन, नियमित, बहु-आयामी, आकार polymorphic समानांतर सरणी प्रदान करता है। सभी संख्यात्मक डेटा unboxed संग्रहीत किया जाता है। रेपा संयोजकों के साथ लिखे गए कार्यों को स्वचालित रूप से समांतर किया जाता है बशर्ते आप प्रोग्राम चलाते समय कमांड लाइन पर + आरटीएस-जो भी आपूर्ति करें।

हाल ही में, इसका उपयोग कुछ छवि प्रसंस्करण समस्याओं के लिए किया गया है:

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

repa-io पैकेज में .bmp छवि फ़ाइलों को पढ़ने और लिखने के लिए समर्थन शामिल है, हालांकि अधिक प्रारूपों के लिए समर्थन की आवश्यकता है।

अपने विशिष्ट प्रश्नों को संबोधित करते हुए, यहां एक ग्राफिक है, चर्चा के साथ:

वेक्टर के बीच किस आधार पर चयन करना चाहिए। अनबॉक्सिंग और UArray?

उनके पास लगभग समान अंतर्निहित प्रतिनिधित्व है, हालांकि, प्राथमिक अंतर एपीआई की UArray साथ काम करने की चौड़ाई है: उनके पास लगभग सभी ऑपरेशन होते हैं जिन्हें आप आम तौर पर सूचियों (एक संलयन-संचालित अनुकूलन ढांचे के साथ) के साथ UArray हैं, जबकि UArray पास है लगभग कोई एपीआई नहीं।

रंगीन छवियों के लिए मैं 16-बिट पूर्णांक के ट्रिपल या एकल-परिशुद्धता फ़्लोटिंग-पॉइंट संख्याओं के ट्रिपल स्टोर करना चाहता हूं।

UArray बहु-आयामी डेटा के लिए बेहतर समर्थन है, क्योंकि यह अनुक्रमण के लिए मनमाना डेटा प्रकार का उपयोग कर सकते हैं। हालांकि यह Vector में संभव है (आपके तत्व प्रकार के लिए UA का एक उदाहरण लिखकर), यह Vector का प्राथमिक लक्ष्य नहीं है - इसके बजाए, जहां Repa कदम Repa है, जिससे इसे संग्रहीत कस्टम डेटा प्रकारों का उपयोग करना बहुत आसान हो जाता है आकार सूचकांक के लिए धन्यवाद, एक कुशल तरीका।

Repa , शॉर्ट्स के आपके ट्रिपल में टाइप होगा:

Array DIM3 Word16

यही है, वर्ड 16 एस की एक 3 डी सरणी।

बिटोनल छवियों के लिए मुझे केवल 1 बिट प्रति पिक्सल स्टोर करने की आवश्यकता होगी।

बग्स बिट्स के रूप में बूल पैक करते हैं, वेक्टर बूल के उदाहरण का उपयोग करता है जो Word8 आधार पर एक प्रतिनिधित्व का उपयोग करके बिट पैकिंग करता है। हाउवर, वैक्टरों के लिए थोड़ा-पैकिंग कार्यान्वयन लिखना आसान है - यहां एक (अप्रचलित) यूवेक्टर लाइब्रेरी से एक है। हुड के तहत, Repa Vectors का उपयोग करता है, इसलिए मुझे लगता है कि यह पुस्तकालय प्रतिनिधित्व विकल्पों को विरासत में लेता है।

क्या एक पूर्वनिर्धारित डेटाटाइप है जो एक शब्द में एकाधिक पिक्सल पैक करके मेरी मदद कर सकता है

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

अंत में, मेरे सरणी द्वि-आयामी हैं

UArray और रेपा कुशल बहु आयामी सरणी का समर्थन करते हैं। ऐसा करने के लिए रेपा के पास एक समृद्ध इंटरफ़ेस भी है। अपने आप पर वेक्टर नहीं है।

उल्लेखनीय उल्लेख:

  • hmatrix , रैखिक बीजगणित पैकेजों के लिए व्यापक बाइंडिंग के साथ एक कस्टम सरणी प्रकार। vector या repa प्रकारों का उपयोग करने के लिए बाध्य होना चाहिए।
  • ix-shapeable , नियमित सरणी से अधिक लचीला अनुक्रमण प्राप्त हो रही है
  • chalkboard , एंडी गिल की लाइब्रेरी 2 डी छवियों में हेरफेर करने के लिए
  • codec-image-devil , UArray के लिए विभिन्न छवि प्रारूपों को पढ़ें और लिखें

हालांकि, यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है और वास्तव में ऐसा भी नहीं है, मैं हैकेज पर CV या CV-combinators पुस्तकालयों को देखने की सलाह दूंगा। वे ओपनसीवी-लाइब्रेरी से कई उपयोगी छवि प्रसंस्करण और दृष्टि ऑपरेटरों को बांधते हैं और मशीन दृष्टि समस्याओं के साथ काम करते हैं।

यह बहुत अच्छा होगा अगर कोई यह बताता है कि कैसे रेपा या कुछ ऐसी सरणी लाइब्रेरी को ओपनसीवी के साथ सीधे इस्तेमाल किया जा सकता है।


यहां एक नई हास्केल छवि प्रसंस्करण लाइब्रेरी है जो प्रश्न में सभी कार्यों को संभाल सकती है और बहुत कुछ। वर्तमान में यह अंतर्निहित प्रतिनिधित्व के लिए Repa और Vector पैकेज का उपयोग करता है, जिसके परिणामस्वरूप संलयन, समानांतर गणना, उत्परिवर्तन और उन पुस्तकालयों के साथ आने वाली अन्य अन्य उपहारों को प्राप्त होता है। यह एक आसान उपयोग इंटरफ़ेस प्रदान करता है जो छवि कुशलता के लिए प्राकृतिक है:

  • मनमाने ढंग से परिशुद्धता के साथ 2 डी अनुक्रमण और अनबॉक्स किए गए पिक्सेल ( Double , Float , Word16 , आदि ..)
  • map , fold , zipWith सभी आवश्यक कार्यों, traverse ...
  • विभिन्न रंग रिक्त स्थानों के लिए समर्थन: आरजीबी, एचएसआई, ग्रे स्केल, द्वि-टोनल, कॉम्प्लेक्स इत्यादि।
  • सामान्य छवि प्रसंस्करण कार्यक्षमता:
    • बाइनरी morphology
    • कनवल्शन
    • प्रक्षेप
    • फुरियर रूपांतरण
    • हिस्टोग्राम साजिश
    • आदि।
  • नियमित संख्या के रूप में पिक्सेल और छवियों का इलाज करने की क्षमता।
  • JuicyPixels लाइब्रेरी के माध्यम से सामान्य छवि प्रारूपों को पढ़ना और लिखना

सबसे महत्वपूर्ण बात यह है कि यह एक शुद्ध हास्केल लाइब्रेरी है, इसलिए यह किसी बाहरी कार्यक्रम पर निर्भर नहीं है। यह भी अत्यधिक विस्तार योग्य है, नए रंग रिक्त स्थान और छवि प्रस्तुतियों को पेश किया जा सकता है।

एक चीज जो यह नहीं करती है वह एक Word में एकाधिक बाइनरी पिक्सल पैक कर रही है, इसके बजाय यह भविष्य में एक Word प्रति बाइनरी पिक्सेल का उपयोग करती है ...


एक बार मैंने हास्केल सरणी पुस्तकालयों की विशेषताओं की समीक्षा की जो मेरे लिए महत्वपूर्ण हैं, और एक तुलना तालिका संकलित (केवल स्प्रेडशीट: सीधा लिंक )। तो मैं जवाब देने की कोशिश करूंगा।

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

अगर किसी को दो-आयामी या बहु-आयामी सरणी की आवश्यकता होती है तो वेक्टर पर UArray को प्राथमिकता दी जा सकती है। लेकिन वेक्टर में मैनिप्लेटिंग, अच्छी तरह से, वैक्टर के लिए निसर एपीआई है। आम तौर पर, वेक्टर बहु-आयामी सरणी अनुकरण करने के लिए उपयुक्त नहीं है।

वेक्टर। अनबॉक्सिंग समानांतर रणनीतियों के साथ उपयोग नहीं किया जा सकता है। मुझे संदेह है कि UArray का उपयोग नहीं किया जा सकता है, लेकिन कम से कम यह UArray से बॉक्स किए गए ऐरे में स्विच करना बहुत आसान है और देखें कि समानांतर लाभ मुक्केबाजी लागत से अधिक वजन बढ़ाते हैं या नहीं।

रंगीन छवियों के लिए मैं 16-बिट पूर्णांक के ट्रिपल या एकल-परिशुद्धता फ़्लोटिंग-पॉइंट संख्याओं के ट्रिपल स्टोर करना चाहता हूं। इस उद्देश्य के लिए, या तो वेक्टर या UArray उपयोग करने में आसान है? अधिक कलाकार?

मैंने छवियों का प्रतिनिधित्व करने के लिए Arrays का उपयोग करने की कोशिश की (हालांकि मुझे केवल ग्रेस्केल छवियों की आवश्यकता है)। रंगीन छवियों के लिए मैंने ग्रेस्केल छवियों के लिए छवियों को पढ़ने / लिखने के लिए कोडेक-छवि-देविल लाइब्रेरी का उपयोग किया, मैंने पीजीएम लाइब्रेरी (शुद्ध हास्केल) का उपयोग किया।

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

लगभग हर बार एक नए ऐरे को मौजूदा से बनाया जाना है, मूल्यों की एक मध्यवर्ती सूची का निर्माण किया जाना चाहिए (जैसे सज्जन परिचय से मैट्रिक्स गुणा में)। सरणी निर्माण की लागत अक्सर तेजी से यादृच्छिक पहुंच के लाभों को दूर करती है, इस बिंदु पर कि मेरे कुछ उपयोग मामलों में एक सूची-आधारित प्रतिनिधित्व तेज है।

STUArray मेरी मदद कर सकता था, लेकिन मुझे गुप्त प्रकार की त्रुटियों और STUArray के साथ पॉलिमॉर्फिक कोड लिखने के लिए आवश्यक प्रयासों से लड़ना पसंद नहीं आया।

तो Arrays के साथ समस्या यह है कि वे संख्यात्मक गणना के लिए उपयुक्त नहीं हैं। हैमट्रिक्स 'डेटा। पैक किया गया। वेक्टर और डेटा। पैक किया गया। मैट्रिक्स इस संबंध में बेहतर हैं, क्योंकि वे ठोस मैट्रिक्स लाइब्रेरी (ध्यान: जीपीएल लाइसेंस) के साथ आते हैं। प्रदर्शन-वार, मैट्रिक्स गुणा पर, हैमट्रिक्स पर्याप्त तेज़ था ( केवल ऑक्टेव से थोड़ा धीमा ), लेकिन बहुत स्मृति-भूखा (पाइथन / SciPy से कई गुना अधिक उपभोग)।

Matrices के लिए ब्लैस लाइब्रेरी भी है, लेकिन यह जीएचसी 7 पर नहीं बना है।

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

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

बिटोनल छवियों के लिए मुझे केवल 1 बिट प्रति पिक्सल स्टोर करने की आवश्यकता होगी। क्या कोई पूर्वनिर्धारित डेटाटाइप है जो मुझे एक शब्द में एकाधिक पिक्सेल पैक करके यहां मदद कर सकता है, या मैं खुद ही हूं?

जहां तक ​​मुझे पता है, बूल के अनबॉक्स किए गए सरणी पैकिंग और बिट वैक्टरों को अनपॅक करने का ख्याल रखते हैं। मुझे याद है कि अन्य पुस्तकालयों में बूल के सरणी के कार्यान्वयन को देखते हुए, और इसे कहीं और नहीं देखा।

अंत में, मेरे सरणी द्वि-आयामी हैं। मुझे लगता है कि मैं "एरे की सरणी" (या वेक्टरों के वेक्टर) के रूप में प्रतिनिधित्व द्वारा लगाए गए अतिरिक्त संकेत से निपट सकता हूं, लेकिन मैं एक अमूर्त पसंद करूंगा जिसमें इंडेक्स-मैपिंग समर्थन हो। क्या कोई मानक लाइब्रेरी से या हैकेज से कुछ भी सुझा सकता है?

वेक्टर (और सरल सूचियों) के अलावा, अन्य सभी सरणी पुस्तकालय दो-आयामी सरणी या मैट्रिस का प्रतिनिधित्व करने में सक्षम हैं। मुझे लगता है कि वे अनावश्यक संकेत से बचें।





bitmap