سؤال

أنا أكتب مرشح غوسي الخاص بي ولكنه بطيء حقا.

خوارزمية غوسية في OpenCV أسرع بكثير، 20 مرة من مرشح غاوسي. أريد إعادة كتابة خوارزمية Gaussian في OpenCV في مشروعي، ولا أريد تضمين OpenCV في مشروعي.

ومع ذلك،

هل يمكن لأي شخص أن يعطيني الخوارزمية الوصف، يبدو أن شفرة OpenCV المصدر يصعب فهمها؟

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

المحلول

يحتوي مرشح Gaussian على عقار يجعله من السهل للغاية تسريعه: يمكن تطبيق المرشح في كل من الأبعاد بشكل مستقل. يمكنك تحديد مرشح أحادي الأبعاد يعمل رأسيا، وآخر يعمل أفقيا، وتطبيقها على حد سواء؛ ينتج هذا نفس التأثير كمرشح واحد يتم تطبيقه في أبعادين.

أبعد من ذلك، ربما تحتاج إلى أن ننظر إلى تعليمات SIMD. على سبيل المثال SSE3. متاح للمعالج الخاص بك.

نصائح أخرى

للإجابة على الجزء الثاني من سؤالك، فإن Blur Gaussian هو ببساطة سطح Gaussian ثلاثي الأبعاد المطبق ككفطاء نواة على الصورة. ويكيبيديا لديه مرجع كبير على الخوارزمية نفسها، ولكن في الأساس، تأخذ قيم منحنى غاوس وتحويل ذلك إلى مصفوفة مربعة، وتضاعفها من قبل كل بكسل في صورتك، على سبيل المثال:

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

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

للإجابة على جزء الأداء من سؤالك، ستعتمد السرعة الإجمالية لهذه الخوارزمية على بعض الأشياء، على افتراض صورة ثابتة ثابتة. دعونا نقول الصورة هي البكسلات NXM، ونصر التنزل هو pxp pixels. سوف تضطر إلى القيام صبعمليات ن * م. عظمت P، كلما زادت العمليات التي ستضطر لها للحصول على صورة معينة. يمكنك الحصول على ماكرة مع الخوارزمية التي تستخدمها هنا، القيام بالصف أو الرياضيات القائم على العمود.

التنفيذ هو أيضا مهم جدا. إذا كنت تريد أن تكون فعالا للغاية، فربما ترغب في استخدام الإرشادات الأكثر تقدما التي تقدمها المعمارية الخاصة بك. إذا كنت تستخدم رقاقة Intel X86، فربما ترغب في إلقاء نظرة على الحصول على ترخيص لبيئات أداء Intel (IPP) ودعا التعليمات مباشرة. IIRC، OpenCV تستخدم استخدام IPP عند توفرها ...

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

حاول التحقق هنا. وبعد تريد معرفة مصفوفة Gaussian المنفصلة في وقت مبكر، ثم قام بذنها بالصورة.

إذا كانت نواة التنزل الخاصة بك كبيرة نسبيا وأنت تنفذ الأزيل المباشر، فقد يكون اختلاف الأداء لأن OpenCV ينفذ الأزيل باستخدام تحويل سريع سريع (FFT).

أكره أن أكون محادثا، لكنك تطلب خوارزمية، أي تسلسل دقيق من الخطوات اللازمة لإنجاز المهمة. لديك بالفعل خوارزمية غوسية. لذلك النقطة الأساسية لسؤالك هي عندما تسأل عن شيء ما أسرع, ، وهذا ليس هو نفسه طلب خوارزمية.

للإجابة على أسرع سؤال - تريد أن تعرف كيف تعمل OpenCV على رمزها، وهو موضوع تقني وطاقم للغاية. وأود أن يخاطر تخمين بالقول إنه يستخدم لغة التجميع ووظائف GPU الخاصة. سأبدأ من خلال تعلم التجميع، والبحث في حزمة CUDA للاستفادة من GPU الخاص بك.

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