Ali Ismael نشر 6 نوفمبر 2021 أرسل تقرير نشر 6 نوفمبر 2021 أريد طريقة لاستخدامها في اكتشاف الخطوط العمودية والأفقية، واعتقد أن HoughLines هو الطريقة الأفضل، لذا أريد مثال لتوضيح استخدامه؟ 1 اقتباس
0 Ali Haidar Ahmad نشر 6 نوفمبر 2021 أرسل تقرير نشر 6 نوفمبر 2021 نعم كما ذكرت فإن تحويل هوف هو الأفضل حيث يمكنه اكتشاف أي خط يمكن تمثيله بمعادلة رياضية، ويمكنه اكتشاف الشكل حتى لو كان يحتوي على بعض الضجيج والتقطعات. في opencv هذه الخوارزمية يمكنك أن تقوم بتطبيقها من خلال التابع cv2.HoughLines ويعيد لنا هذا التابع مصفوفة لقيم (p,θ )، حيث أن p وثيتا هما المعاملات التي تمثل الخط. انظر إلى المثال التالي: import cv2 from google.colab.patches import cv2_imshow import numpy as np # قراءة الصورة img = cv2.imread('/content/4wQjD.jpg') # تحويلها للصيغة الرمادية gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # تطبيق المرشح كاني edges = cv2.Canny(gray,50,150,apertureSize = 3) # تطبيق تحويل هوف lines = cv2.HoughLines(edges,1,np.pi/180,200) # رسم الخطوط for rho,theta in lines[0]: a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) cv2_imshow(edges) cv2_imshow(img) حيث أن المتغير الأول يمثل صورة الدخل بالصيغة الثنائية. لذالك نستخدم مكتشف حواف مثل كاني أو نطبق التعتيب. أما ثاني وثالث متغير فهما p وثيتا، ورابع متغير هو العتبة وهي تعني أقل صوت يجب أن نحصل عليه لنعتبره خط (عدد الأصوات يعتمد على عدد النقاط على الخط وهذا يعني أصغر طول للخط الذي يجب أن يتم اكتشافه). النتيجة: كما يمكنك استخدام تحويل هاف الاحتمالي cv2.HoughLinesP الذي يعتبر تحسين لتحويل هاف العادي. ويملك وسيطين إضافيين عن التابع السابق وهما minLineLength الذي يمثل أقل طول للخط، حيث يتجاهل كل خط أقل من هذه القيمة. و maxLineGap الذ يمثل المساحة العظمى المسموحة بين أجزاء الخط لاعتباره خطاً واحداً. ويعيد لنا بداية كل خط ونهايته مباشرةً على عكس الطريقة السابقة التي كانت تعطينا معاملات الخطوط فقط. وبالتالي الصعوبة في إيجاد كل النقط. مثال: from google.colab.patches import cv2_imshow import numpy as np import cv2 gray = cv2.imread('/content/4wQjD.jpg') edges = cv2.Canny(gray,50,150,apertureSize = 3) cv2.imwrite('edges-50-150.jpg',edges) le = cv2.HoughLinesP(image=edges,rho=1,theta=np.pi/180, threshold=100, lines=np.array([]), minLineLength=100, maxLineGap=80) x,_,_ = le.shape for i in range(x): cv2.line(gray, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA) cv2_imshow(edges) cv2_imshow(gray) النتيجة: اقتباس
السؤال
Ali Ismael
أريد طريقة لاستخدامها في اكتشاف الخطوط العمودية والأفقية، واعتقد أن HoughLines هو الطريقة الأفضل، لذا أريد مثال لتوضيح استخدامه؟
1 جواب على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.