2008-09-27 19 views
5

मैं कंप्यूटर इमेजिंग के नट-ग्रेटीज़ के साथ कुछ काम करना चाहता हूं। मैं डेटा के एकल पिक्सेल पढ़ने, उन्हें प्रोग्रामिक रूप से विश्लेषण करने और उन्हें बदलने का एक तरीका ढूंढ रहा हूं। इस के लिए उपयोग करने के लिए सबसे अच्छी भाषा क्या है (पायथन, सी ++, जावा ...)? सबसे अच्छा फाइलफॉर्मेट क्या है?छवि पहचान

मैं किसी भी सुपर फैंसी सॉफ्टवेयर/एपीआई नहीं चाहता ... मैं नंगे मूल बातें की तलाश में हूँ।

उत्तर

7

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

0

संक्षिप्त उत्तर? मैं सी ++ कहूंगा, आपके पास पाइथन या जावा की तुलना में स्मृति के कच्चे भाग में हेरफेर करने में कहीं अधिक लचीलापन है।

2

न केवल सी/सी ++ तेज होगा, लेकिन आप पाएंगे कि अधिकांश छवि प्रसंस्करण नमूना कोड सी में भी होगा, इसलिए आपको जो चीजें मिलती हैं उन्हें शामिल करना आसान होगा।

1

(यह ओपी जो केवल नंगे मूल बातें करना चाहता था के लिए आवेदन नहीं कर सकते हैं -। लेकिन अब उस गति मुद्दे को लाया गया था, मैं सिर्फ रिकार्ड के लिए यह लिखने के लिए, की आवश्यकता है)

आप तो वास्तव में की गति की आवश्यकता है, पिक्सेल-बाय-पिक्सेल स्तर पर काम करने के बारे में भूलना बेहतर है, और यह देखने के लिए कि आपको जो ऑपरेशन करने की आवश्यकता है वह vectorized हो सकता है। उदाहरण के लिए, आपके सी/सी ++ कोड के लिए आप उत्कृष्ट Intel IPP library (नहीं, मैं इंटेल के लिए काम नहीं करता) का उपयोग कर सकता हूं।

1

यदि आप अपनी छवियों (विचार मैट्रिक्स) पर संख्यात्मक काम की तलाश में हैं और आप पाइथन में http://www.scipy.org/PyLab देखें - यह मूल रूप से पाइथन में मैटलैब करने की क्षमता है, इसके द्वारा मेरी शपथ के दोस्त।

4

पायथन जैसे उच्च स्तरीय भाषाओं का उपयोग करके चित्रों की पिक्सेल जानकारी के बड़े बहु-आयामी या जटिल सरणी में हेरफेर करना बहुत पूर्व है। PIL (the Python Imaging Library नामक एक लाइब्रेरी है) जो काफी उपयोगी है और आपको सामान्य फ़िल्टर और परिवर्तन (चमक, नरम, विलुप्त होने, फसल इत्यादि को बदलने) के साथ-साथ कच्चे पिक्सेल डेटा में हेरफेर करने देगी।

यह easiest and simplest छवि लाइब्रेरी है जिसे मैंने आज तक उपयोग किया है और जो भी आप रुचि रखते हैं उसे करने के लिए बढ़ाया जा सकता है (उदाहरण के लिए, बहुत कम कोड में edge detection)।

1

यह तुम क्या करने की कोशिश कर रहे हैं क्या पर एक छोटे से निर्भर करता है।

क्रम गति आपकी समस्या है तो C++ जाना सबसे अच्छा तरीका है।

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

यदि आप सी ++ विकल्प (या अजगर के बारे में सोचने के लिए आते हैं) के लिए जाते हैं तो मैं फिर से पढ़ने के स्टार्टअप मुद्दों पर आपको प्राप्त करने के लिए लाइब्रेरी के उपयोग का सुझाव दूंगा और फाइलें लिखना। मुझे पहले libgd

1

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

1

लघु जवाब: सी ++ और OpenCV

1

मैं आर्टिफिशियल इंटेलिजेंस और कंप्यूटर विजन का अध्ययन किया है, इस प्रकार मैं बहुत अच्छी तरह जानते हैं कि इस क्षेत्र में उपयोग किया जाता है उपकरणों की तरह।

असल में: आप जो भी चाहें उसका उपयोग कर सकते हैं जब तक आप जानते हैं कि यह दृश्य के पीछे कैसे काम करता है।

अब आप क्या हासिल करना, आप या तो उपयोग कर सकते हैं चाहते हैं पर निर्भर करता है:

  • सी भाषा है, लेकिन आप जब अपने एल्गोरिदम को लागू करने कीड़े जाँच और स्मृति प्रबंधन में बहुत समय खो देंगे। तो सैद्धांतिक रूप से, यह उस तरह की नौकरी करने की सबसे तेज़ भाषा है, लेकिन यदि आपके एल्गोरिदम गणनात्मक रूप से कुशल नहीं हैं (जटिलता के मामले में) या यदि आप बग की जांच में बहुत अधिक समय खो देते हैं, तो यह स्पष्ट रूप से इसके लायक नहीं है। तो मैं सलाह देता हूं कि पहले अपने आवेदन को किसी अन्य भाषा में लागू करें, और उसके बाद आप हमेशा अपने कोड के छोटे हिस्सों को सी बाइंडिंग के साथ अनुकूलित कर सकते हैं।
  • ऑक्टवे/मैटलैब: बहुत ही कुशल भाषा, लगभग जितना सी, और आप बहुत ही सुरुचिपूर्ण और संक्षिप्त एल्गोरिदम बना सकते हैं। यदि आप वेक्टरेशन, मैट्रिक्स और रैखिक संचालन में हैं, तो आपको इसके साथ जाना चाहिए। हालांकि, आप इस भाषा के साथ एक संपूर्ण अनुप्रयोग विकसित करने में सक्षम नहीं होंगे, यह एल्गोरिदम पर अधिक केंद्रित है, लेकिन फिर आप बाद में किसी अन्य भाषा का उपयोग कर इंटरफ़ेस विकसित कर सकते हैं।
  • पायथन: सभी में एक सुरुचिपूर्ण और सुलभ भाषा, जो Google और Facebook जैसे बड़े पैमाने पर बड़े पैमाने पर अनुप्रयोगों में उपयोग की जाती है। आप पाइथन, किसी भी प्रकार के आवेदन के साथ जो कुछ भी चाहते हैं, वह कर सकते हैं। यदि आप एक पूर्ण आवेदन (क्लाइंट इंटरैक्शन और सभी के साथ, न केवल एल्गोरिदम के साथ) बनाना चाहते हैं, या यदि आप मौजूदा पुस्तकालयों का उपयोग करके प्रोटोटाइप को जल्दी से ड्राफ्ट करना चाहते हैं, तो इसे पूरी तरह से अनुकूलित किया जाएगा क्योंकि पाइथन के पास उच्च गुणवत्ता वाले पुस्तकालयों का एक बहुत बड़ा सेट है, जैसे OpenCV। हालांकि अगर आप केवल एल्गोरिदम बनाना चाहते हैं, तो आपको ऑक्टेव/मैटलैब का बेहतर उपयोग करना चाहिए।

एक समाधान के रूप में चुना गया उत्तर बहुत ही बाध्य है, और आपको इस तरह की पुरातन टिप्पणी के बारे में सावधान रहना चाहिए।

आजकल, हार्डवेयर गीलेवेयर (इंसान) से सस्ता है, और इस प्रकार, आपको उन भाषाओं का उपयोग करना चाहिए जहां आप परिणाम उत्पन्न करने में सक्षम होंगे, भले ही यह कुछ CPU चक्र या मेमोरी स्पेस की कीमत पर हो।

इसके अलावा, बहुत से लोग सोचते हैं कि जब तक आप सी/सी ++ में अपने सॉफ़्टवेयर को लागू करते हैं, तो आप गति की संत Graal बना रहे हैं: यह सच नहीं है।सबसे पहले, क्योंकि एल्गोरिदम जटिलता आपके द्वारा उपयोग की जा रही भाषा से बहुत अधिक मायने रखती है (एक खराब एल्गोरिदम कभी भी बेहतर एल्गोरिदम को हरा नहीं देगा, भले ही ब्रह्मांड में सबसे धीमी भाषा में लागू किया गया हो), और दूसरी बात यह है कि उच्च स्तरीय भाषाएं आजकल बहुत कुछ कर रही हैं आपके लिए कैशिंग और गति अनुकूलन का, और यह आपके प्रोग्राम को सी/सी ++ की तुलना में तेज़ी से चला सकता है।

बेशक, आप उपर्युक्त सभी चीजें सी/सी ++ में हमेशा कर सकते हैं, लेकिन पहिया को फिर से शुरू करने के लिए आप कितना समय बर्बाद कर सकते हैं?

संबंधित मुद्दे