في السابق رأينا اكتشاف الخصائص و الموصفاتفي SIFT ولكن بعض الناس تحتاج نسخة أكثر سرعة لهذا , ولذلك في 2006 قام ثلاثة باحثين بوضع خوارزمية أخرى وهي SURF الخصائص القوية المسرعة.
حيث في SIFT ثم حساب LoG اما هنا فيتم التبسيط أكثر بحساب المرشح الصندوقي , المتوسط , للصورة , ومن حسناتها الكبيرة أن هذا المرشح يحسب بسهولة بوساطة مكاملة الصورة , ويمكن حسابه بشكل موازي ولقياسات مختلفة . وأيضاً تعتمد ال SURF على محدد مصفوفة الHussian لكل من الموضع والقياس
ولحساب الاتجاه تعتمد ال SURF على كل من استجابات Wavlets في كل من الاتجاهين العامودي والافقي , وبجوار بحوالي 6 أضعاف القياس , ومن ثم يرسم الناتج كنقاط في الفضاء والكثافة الاعلى يتم أعتمادها كاتجاه مناسب للخاصية , وذلك عن طريق جمع الاستجابات بزاوية متغيرة بقيمة 60 درجة كل مرة .
والامر المثير أن استجابات wavelets يمكن ايجادها بسهولة بالغة , عند أي قياس . وللعديد من التطبيقات ثبات الاتجاه غير مطلوب , ولذلك لا داعي لايجاد الزاوية مما يسرع الخوارزمية , وتدعى هذه الصيغة U-SURF , وهي فعالة لحوالي +-15 . في OpenCV هناك علم يحدد هل نستخدمها 0 , أم لا 1.
ولوصف الخصائص نستخدم الاستجابات السابقة بالاتجاهين العامودي و الافقي , ولذلك نأخذ جوار 20s X20s حيث s هي القياس , حول النقطة . وستقسم ل 4X4 مقطعاً . ولكل مقطع نأخذ الاستجابات ونشكل الشعاع : $v = (\sum {d_x},\sum {d_y},\sum {\lvert d_x \rvert},\sum {\lvert d_y \rvert}).$ وهذا عند تمثيله كشعاع يعطي موصف ال SURF ب 64 بعداً وكلما قللناها حصلنا على سرعة أكثر ولكنت على حساب الدقة .
ولدقة أكبر لدى SURF نمط أخر , نحسب فيه 128 بعداً للموصف , وهذا النمط يمثل في OpenCV بعلم يكون 0 ل 64 بعد أو 1 ل 128 بعد.
وهناك تحسين آخر هو باستخدام إشارة اللابلاسيان , ( أثر مصفوفة هوسيان). وهذا لا يزيد التعقيد الحسابي بما أنه محسوب أصلاً أثناء الاكتشاف , وهذه الاشارة توضح الخلفيات العاتمة وراء الاجسام البيضاء أو الوضع المعاكس , وعند المطابقة نلاحظ أولاً وضع التباين البيني , وهذه المعلومة البسيطة تسرع الاداء بالمطابقة دون التأثير على أداء الموصف.
باختصار , فانSURF تعطي العديد من الميزات بكل مرحلة , حيث يظهر التحليل أنها أسرع بحوالي 3 مرات من SIFT بينما الاداء يقارن بال SIFT .
وال SURF جيدة للصور المدورة والضبابية , ينما غير جيدة كثيراً للتعامل مع تغير ناحية الرؤية وتغيرات التألق.
SURF في OpenCV:¶
يعطي OpenCV تابع يقوم باشتقاق الخصائص وفق SURF مشابه لتابعSIFT , ونمرر له المداخل المناسبة الاختيارية , ومن ثم نكتشف الخصائص ونحسب الموصفات ..
أولا ً سنأخذ مثالاً بسيطاً :
img = cv2.imread('mario.jpg',0)
انشىء جسم SURF , يمكنك تحديد البارامترات لاحقاً . ونضع عتبة المصفوفة ل 400.
surf = cv2.SURF(400)
أوجد الخصائص والموصفات مباشرة .
kp, des = surf.detectAndCompute(img,None)
len(kp)
296
296 نقطة عدد ضخم للرسم , لذلك نزيد العتبة لتصل ل 50 نقطة . وعند المقارنة سنحتاج كل تلك الخصائص ولكن ليس الان
print surf.hessianThreshold
400.0
سنجعلها مثلاً 5000 . تذكر , هذا فقط للتمثيل بالصورة ..
surf.hessianThreshold = 5000
kp, des = surf.detectAndCompute(img,None)
print len(kp)
61
وهذا مناسب أكثر , لذلك نكتب ,
img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)
plt.figure(figsize=(8,16))
plt.imshow(img2)
plt.xticks([])
plt.yticks([])
plt.title('Result')
plt.show()
كما يمكن تغيير كل من علم حساب الاتجاه , للتسريع ..
وكذلك علم زيادة طول شعاع الخصائص.
surf.upright = True
# So we make it to True to get 128-dim descriptors.
surf.extended = True
وما تبقى هو المطابقة ..
ليست هناك تعليقات:
إرسال تعليق