سؤال

أرغب في القيام ببعض الأعمال باستخدام التفاصيل الدقيقة للتصوير بالكمبيوتر.أبحث عن طريقة لقراءة وحدات بكسل واحدة من البيانات وتحليلها برمجيًا وتغييرها.ما هي أفضل لغة يمكن استخدامها لهذا (Python، c++، Java...)؟ما هو تنسيق الملف الأفضل؟

لا أريد أي برامج/واجهات برمجة تطبيقات رائعة جدًا...أنا أبحث عن الأساسيات العارية.

هل كانت مفيدة؟

المحلول

إذا كنت بحاجة إلى السرعة (ربما ستحتاج دائمًا إلى السرعة في معالجة الصور)، فيجب عليك بالتأكيد العمل مع بيانات البكسل الأولية.لدى Java بعض العيوب الحقيقية حيث لا يمكنك الوصول إلى الذاكرة مباشرة مما يجعل الوصول إلى البكسل بطيئًا جدًا مقارنة بالوصول إلى الذاكرة مباشرة.C++ هي بالتأكيد اللغة المفضلة لمعالجة الصور باستخدام الإنتاج.ولكن يمكنك، على سبيل المثال، أيضًا استخدام لغة C# لأنها تسمح بتعليمات برمجية غير آمنة في مناطق معينة.(ألقِ نظرة على خاصية مؤشر Scan0 لفئة BitmapData.) لقد استخدمت C# بنجاح لتطبيقات معالجة الصور وهي بالتأكيد أسرع بكثير من نظرائهم Java.لن أستخدم أي لغة برمجة نصية أو جافا لهذا الغرض.

نصائح أخرى

من السهل جدًا التعامل مع المصفوفات الكبيرة متعددة الأبعاد أو المعقدة من معلومات البكسل التي تكون عبارة عن صور تستخدم لغات عالية المستوى مثل بايثون.هناك مكتبة تسمى PIL (مكتبة التصوير بايثون).) وهو أمر مفيد للغاية وسيتيح لك إجراء مرشحات وتحويلات عامة (تغيير السطوع، والتنعيم، وعدم التشبع، والاقتصاص، وما إلى ذلك) بالإضافة إلى معالجة بيانات البكسل الأولية.

انها أسهل وأبسط مكتبة الصور التي استخدمتها حتى الآن ويمكن توسيعها للقيام بكل ما يهمك (كشف الحد في القليل جدًا من التعليمات البرمجية، على سبيل المثال).

لن تكون لغة C/C++ أسرع فحسب، بل إن معظم نماذج التعليمات البرمجية لمعالجة الصور التي تجدها موجودة في لغة C أيضًا، لذلك سيكون من الأسهل دمج الأشياء التي تجدها.

إذا كنت تتطلع إلى العمل العددي على صورك (فكر في المصفوفة) وأنت في بايثون تحقق من ذلك http://www.scipy.org/PyLab - هذه هي في الأساس القدرة على عمل الماتلاب بلغة بايثون، صديقي يقسم بها.

(قد لا ينطبق هذا على OP الذي أراد فقط الأساسيات - ولكن الآن بعد أن تم طرح مشكلة السرعة، أحتاج إلى كتابة هذا، فقط للسجل.)

اذا أنت حقًا تحتاج إلى السرعة، فمن الأفضل أن تنسى العمل على مستوى كل بكسل على حدة، وبدلاً من ذلك معرفة ما إذا كان من الممكن تنفيذ العمليات التي تحتاج إلى تنفيذها متجه.على سبيل المثال، بالنسبة لكود C/C++ الخاص بك، يمكنك استخدام الملف Excellent مكتبة إنتل IPP (لا، ​​أنا لا أعمل لدى شركة إنتل).

يعتمد الأمر قليلاً على ما تحاول القيام به.

إذا كانت سرعة وقت التشغيل هي مشكلتك، فإن لغة C++ هي أفضل طريقة لذلك.

إذا كانت سرعة التطوير تمثل مشكلة، فأنا أقترح النظر إلى Java.لقد قلت أنك تريد معالجة وحدات البكسل على مستوى منخفض، وهو ما ستفعله Java لك.ولكن الشيء الآخر الذي قد يمثل مشكلة هو التعامل مع تنسيقات الملفات المختلفة.تحتوي Java على بعض واجهات برمجة التطبيقات الرائعة جدًا للتعامل مع قراءة وكتابة تنسيقات الصور المختلفة للملف (خاصة مكتبة java2d.اخترت تجاهل المستويات الأعلى لواجهة برمجة التطبيقات (API)

إذا اخترت خيار c++ (أو فكرت لغة python في الأمر) فسأقترح مرة أخرى استخدام مكتبة لمساعدتك في التغلب على مشكلات بدء التشغيل الخاصة بقراءة الملفات وكتابتها.لقد سبق لي النجاح مع libgd

ما هي اللغة التي تعرفها بشكل أفضل؟بالنسبة لي، هذا هو السؤال الحقيقي.إذا كنت ستقضي أشهرًا وأشهرًا في تعلم لغة معينة، فلن تكون هناك ميزة حقيقية في استخدام Python أو Java فقط لسرعة تطويرهما (التي سيتم إثباتها).أنا ماهر بشكل خاص في لغة C++ وأعتقد أنه في هذه المهمة بالذات يمكنني أن أكون سريعًا مثل مبرمج Java، على سبيل المثال.بمساعدة بعض المكتبات الجيدة (يتبادر إلى ذهنك OpenCV)، يمكنك إنشاء أي شيء تحتاجه في سطرين من كود C++ حقًا.

اجابة قصيرة:C++ وOpenCV

لقد درست الذكاء الاصطناعي والرؤية الحاسوبية، وبالتالي أعرف جيدًا نوع الأدوات المستخدمة في هذا المجال.

أساسًا:يمكنك استخدام ما تريد طالما أنك تعرف كيف يعمل خلف الكواليس.

الآن اعتمادًا على ما تريد تحقيقه، يمكنك إما استخدام:

  • لغة C، ولكنك ستخسر الكثير من الوقت في فحص الأخطاء وإدارة الذاكرة عند تنفيذ الخوارزميات الخاصة بك.لذا، من الناحية النظرية، هذه هي أسرع لغة للقيام بهذا النوع من العمل، ولكن إذا لم تكن الخوارزميات الخاصة بك فعالة حسابيًا (من حيث التعقيد) أو إذا فقدت الكثير من الوقت في التحقق من الأخطاء، فمن الواضح أن هذا لا يستحق كل هذا العناء.لذا أنصحك أولاً بتنفيذ تطبيقك بلغة أخرى، وبعد ذلك يمكنك دائمًا تحسين أجزاء صغيرة من التعليمات البرمجية الخاصة بك باستخدام روابط C.
  • أوكتاف/ماتلاب:لغة فعالة للغاية، تقريبًا مثل لغة C، ويمكنك إنشاء خوارزميات أنيقة وموجزة للغاية.إذا كنت مهتمًا بعمليات التوجيه والمصفوفة والعمليات الخطية، فيجب عليك اتباع ذلك.ومع ذلك، لن تتمكن من تطوير تطبيق كامل بهذه اللغة، فهي تركز بشكل أكبر على الخوارزميات، ولكن بعد ذلك يمكنك دائمًا تطوير واجهة باستخدام لغة أخرى لاحقًا.
  • بايثون:لغة الكل في واحد أنيقة ويمكن الوصول إليها، وتستخدم في تطبيقات واسعة النطاق مثل Google وFacebook.يمكنك فعل كل ما تريده تقريبًا باستخدام Python، وأي نوع من التطبيقات.سيتم تكييفه بشكل مثالي إذا كنت تريد إنشاء تطبيق كامل (مع تفاعل العميل وكل شيء، وليس الخوارزميات فقط)، أو إذا كنت تريد صياغة نموذج أولي بسرعة باستخدام المكتبات الموجودة نظرًا لأن Python لديها مجموعة كبيرة جدًا من المكتبات عالية الجودة، مثل OpenCV.ومع ذلك، إذا كنت تريد فقط إنشاء خوارزميات، فمن الأفضل استخدام Octave/MatLab.

الإجابة التي تم اختيارها كحل متحيزة للغاية، ويجب عليك توخي الحذر بشأن هذا النوع من التعليقات القديمة.

في الوقت الحاضر، أصبحت الأجهزة أرخص من البرامج الرطبة (البشر)، وبالتالي، يجب عليك استخدام اللغات التي ستتمكن من خلالها تحقيق نتائج أسرع، حتى لو كان ذلك على حساب بضع دورات من وحدة المعالجة المركزية أو مساحة الذاكرة.

أيضًا، يميل الكثير من الأشخاص إلى الاعتقاد بأنه طالما أنك تقوم بتنفيذ برنامجك في C/C++، فإنك تصنع السرعة القصوى:هذا ليس صحيحا.أولاً، لأن تعقيد الخوارزميات أكثر أهمية بكثير من اللغة التي تستخدمها (الخوارزمية السيئة لن تتفوق أبدًا على خوارزمية أفضل، حتى لو تم تنفيذها بأبطأ لغة في الكون)، وثانيًا لأن اللغات عالية المستوى في الوقت الحاضر تفعل الكثير التخزين المؤقت وتحسين السرعة بالنسبة لك، وهذا يمكن أن يجعل برنامجك يعمل بشكل أسرع من C/C++.

بالطبع، يمكنك دائمًا القيام بكل ما سبق في C/C++، ولكن ما مقدار الوقت الذي ترغب في إضاعته لإعادة اختراع العجلة؟

اجابة قصيرة؟أود أن أقول C++، لديك مرونة أكبر بكثير في التعامل مع أجزاء الذاكرة الخام من Python أو Java.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top