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

اكتشاف الخطوط العمودية والأفقية في الصورة باستخدام OpenCV في بايثون

Ali Ismael

السؤال

Recommended Posts

  • 0

نعم كما ذكرت فإن تحويل هوف هو الأفضل حيث يمكنه اكتشاف أي خط يمكن تمثيله بمعادلة رياضية، ويمكنه اكتشاف الشكل حتى لو كان يحتوي على بعض الضجيج والتقطعات. في 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 وثيتا، ورابع متغير هو العتبة وهي تعني أقل صوت يجب أن نحصل عليه لنعتبره خط (عدد الأصوات يعتمد على عدد النقاط على الخط وهذا يعني أصغر طول للخط الذي يجب أن يتم اكتشافه).
النتيجة:
2.png.1d24f63b2d97b08f27ce3ce284245ad7.png1.png.20a5daea8f1cc28dc8cd7e98ca6fd73e.png

كما يمكنك استخدام تحويل هاف الاحتمالي 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)

النتيجة:
4wQjD.thumb.jpg.942d9b35c5b50633197f1c034bb55f44.jpg

TGbc8.thumb.jpg.f2d47147df686172414bc0b7fab39bd8.jpg

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...