اذهب إلى المحتوى
  • 0

تطبيق خوارزمية SIFT باستخدام OpenCV في بايثون

Ali Ismael

السؤال

Recommended Posts

  • 0
import cv2 as cv
image = cv.imread("C:/temp/1.png")
gray_image= cv.cvtColor(image,cv2.COLOR_BGR2GRAY)
sift = cv.SIFT()
kp = sift.detect(gray_image,None)
image=cv.drawKeypoints(gray_image,kp)
cv.imshow(image)
cv.waitKey()
cv.destroyAllWindows()

والنتيجة:
1.png.c00b075a4d869f135ed03ba2c426f2bb.png
بدايةً علينا أن نقوم ببناء جسم SIFT، ثم نقوم بتمرير البيانات المختلفة إليه (اختياري).
أولاً نقوم بقراءة الصورة وتحويلها للصيغة الرمادية:

image = cv.imread("C:/temp/1.png")
gray_image= cv.cvtColor(image,cv2.COLOR_BGR2GRAY)

ثم نقوم بإنشاء جسم خوارزمية SIFT وذلك من خلال التابع cv2.SIFT:

sift = cv.SIFT()

ثم نستخدم التابع sift.detect لإيجاد النقاط الرئيسية في الصورة. يمكنك تمرير قناع إذا أردت البحث عنها فقط في جزء محدد. كل نقطة رئيسية لها تركيب خاص وهي تحوي على العديد من الخصائص مثل الإحداثيات x و y، وحجم الجوار ذو المعنى، والزاوية التي تحدد الاتجاه، والاستجابة التي تحدد قوة النقاط الرئيسية.

kp = sift.detect(gray_image,None)

أيضاً استخدمنا التابع:

image=cv.drawKeypoints(gray_image,kp)

الذي يقوم برسم دوائر صغيرة في مواقع النقاط الرئيسية. وإذا مررت cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS له، فسوف يرسم دائرة بحجم النقطة الأساسية وسيعرض أيضاً الاتجاه. أي:

img=cv2.drawKeypoints(gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

النتيجة ستكون:
2.png.b1a10cb094e7ffab1ff93bb5868230ed.png
الآن لحساب الوصف يمكننا القيام بذلك بطريقتين:
1. في حالة أوجدنا النقاط الرئيسية (كما فعلنا) ،استخدم الدالة sift.compute التي تحسب الوصف من خلال النقاط الرئيسية.

kp,des = sift.compute(gray_image,kp)

2.  إذا لم تقوم بإيجاد النقاط الرئيسية، عندها يمكنك إيجاد النقاط الرئيسية+الوصف من خلال الدالة sift.detectAndCompute:

sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray_image,None)

هنا kp تمثل مصفوفة بالنقاط الرئيسية، و des تمثل مصفوفة من الشكل (عدد النقاط * 28) .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

دعنا نوضح ما فائدة تلك الخوارزمية أولا.

نعلم أن أن معظم الخصائصلا تتغير حتى بعد التدوير , ولكن بالنسبة لتغيير الحجم سواء بالتكبير أو التصغير فقد لا يصح هذا، كمثال أن الزاوية لاتبقى نفسها بعد التغيير , لذلك نقول أن مكتشفات هاريس متأثرة بالحجم. ومن هنا نستخدم خوارزمية sift والتي تسمح لنا بعمل بجعل الصورة مناسبة للتكبير والتصغيير دون التأثير على خصائصها.

أما كمثال على تطبيقها في opencv فهو كالتالي:

في البداية علينا تحميل الصورة وبناء نموذج بسيط ل sift:

#استدعاء المكتبات
import cv2
import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline
#تحميل الصورة
img = cv2.imread('wt.jpg')
# قراءة الصورة بشكل صحيح
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# بناء النموذج
sift = cv2.SIFT()
kp = sift.detect(gray,None)

ثم بعد ذلك نظهر الخصائص التي اكتشفها النموذج بوضع داائرة صغيرة حولها:

lt.figure(figsize=(8,16))
plt.imshow(res_img)
plt.xticks([])
plt.yticks([])
plt.title('Ordinary Points')
plt.show()

res2_img=cv2.drawKeypoints(
    gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

plt.figure(figsize=(8,16))
plt.imshow(res2_img)
plt.xticks([])
plt.yticks([])
plt.title('More Clarity Points')

هنا قمنا برسم دوائر صغيرة وكبيرة حول النقاط الرئيسية:

618c193c7fd6f_download(1).png.a85530cd959793473bad8e39714158a9.pngdownload.png.3c62cedea93c67c15d50613130c990c2.png

ثم لحساب المواصفات يوجد عدة طرق لكن ابسطها مباشرة عن طريق ايجاد  النقاط والموصفات بتابع واحد هكذا:

sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray,None)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 10‏/11‏/2021 at 22:12 قال Ahmed Sharshar:

دعنا نوضح ما فائدة تلك الخوارزمية أولا.

نعلم أن أن معظم الخصائصلا تتغير حتى بعد التدوير , ولكن بالنسبة لتغيير الحجم سواء بالتكبير أو التصغير فقد لا يصح هذا، كمثال أن الزاوية لاتبقى نفسها بعد التغيير , لذلك نقول أن مكتشفات هاريس متأثرة بالحجم. ومن هنا نستخدم خوارزمية sift والتي تسمح لنا بعمل بجعل الصورة مناسبة للتكبير والتصغيير دون التأثير على خصائصها.

أما كمثال على تطبيقها في opencv فهو كالتالي:

في البداية علينا تحميل الصورة وبناء نموذج بسيط ل sift:


#استدعاء المكتبات
import cv2
import numpy as np
from matplotlib import pyplot as plt

%matplotlib inline
#تحميل الصورة
img = cv2.imread('wt.jpg')
# قراءة الصورة بشكل صحيح
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# بناء النموذج
sift = cv2.SIFT()
kp = sift.detect(gray,None)

ثم بعد ذلك نظهر الخصائص التي اكتشفها النموذج بوضع داائرة صغيرة حولها:


lt.figure(figsize=(8,16))
plt.imshow(res_img)
plt.xticks([])
plt.yticks([])
plt.title('Ordinary Points')
plt.show()

res2_img=cv2.drawKeypoints(
    gray,kp,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

plt.figure(figsize=(8,16))
plt.imshow(res2_img)
plt.xticks([])
plt.yticks([])
plt.title('More Clarity Points')

هنا قمنا برسم دوائر صغيرة وكبيرة حول النقاط الرئيسية:

618c193c7fd6f_download(1).png.a85530cd959793473bad8e39714158a9.pngdownload.png.3c62cedea93c67c15d50613130c990c2.png

ثم لحساب المواصفات يوجد عدة طرق لكن ابسطها مباشرة عن طريق ايجاد  النقاط والموصفات بتابع واحد هكذا:


sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray,None)

 

السلام عليكم

ممكن سؤال 

كيف يمكن خزن الصوره بعد ماتم تحديد الميزات الرئيسيه

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...