كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

كشف حواف OpenCV في Python باستخدام cv2.Canny ()

المُقدّمة

إن اكتشاف الحافة أمر نقوم به بشكل طبيعي ، ولكنه ليس سهلاً عندما يتعلق الأمر بتحديد قواعد أجهزة الكمبيوتر. في حين تم ابتكار طرق مختلفة ، تم تطوير طريقة السيادة بواسطة John F.

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

الكشف عن حافة الحادة

ما هي طريقة كاني؟ يتكون من أربع عمليات متميزة:

  • تجانس غاوسي
  • تدرجات الحوسبة
  • عدم قمع الحد الأقصى
  • عتبة التباطؤ

تجانس غاوسي كخطوة أولى "لتسوية" صورة الإدخال ، وتخفيف الضوضاء ، مما يجعل الإخراج النهائي أكثر نظافة.

تدرجات الصورة تم استخدامها في التطبيقات السابقة لاكتشاف الحواف. والجدير بالذكر أن مرشحات Sobel و Scharr تعتمد على تدرجات الصورة. يتلخص مرشح Sobel في حبتين (Gx و Gy)، أين Gx بالكشف عن التغيرات الأفقية ، بينما Gy بالكشف عن التغييرات العمودية:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

عندما تقوم بتمريرها فوق صورة ، فسيقوم كل منهم "بالتقاط" (التأكيد) على الخطوط في اتجاهها الخاص. تعمل نواة Scharr بنفس الطريقة ، بقيم مختلفة:

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

هذه المرشحات ، بمجرد أن تلتف فوق الصورة ، ستنتج خرائط ميزات:

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

رصيد الصورة: Davidwkennedy

بالنسبة لخرائط المعالم هذه ، يمكنك حساب ملف حجم التدرج و اتجاه التدرج - أي مدى شدة التغيير (مدى احتمالية أن يكون الشيء ميزة) وفي أي اتجاه يشير التغيير. نظرًا لأن Gy يشير إلى التغيير الرأسي (Y- التدرج) ، و Gx يشير إلى التغيير الأفقي (X-gradient) - يمكنك حساب المقدار ببساطة عن طريق تطبيق نظرية فيثاغورس ، للحصول على وتر المثلث المتشكل بواسطة "اليسار" و الاتجاهات "الصحيحة":

$$
{G} = {sqrt {{{G} _ {x}} ^ {2} + {{G} _ {y}} ^ {2}}}
$$

باستخدام المقدار والاتجاه ، يمكنك إنتاج صورة مع إبراز حوافها:

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

رصيد الصورة: Davidwkennedy

ومع ذلك - يمكنك أن ترى مقدار الضوضاء التي تم التقاطها أيضًا من هيكل الطوب! تدرجات الصورة حساسة جدًا للضوضاء. هذا هو السبب في استخدام مرشحات Sobel و Scharr كمكون ، ولكن ليس النهج الوحيد في طريقة Canny. يساعد التنعيم الغاوسي هنا أيضًا.

عدم قمع الحد الأقصى

هناك مشكلة ملحوظة في مرشح Sobel وهي أن الحواف ليست واضحة حقًا. ليس الأمر كما لو أن شخصًا ما أخذ قلم رصاص ورسم خطًا لإنشاء خط خط للصورة. عادةً ما تكون الحواف غير واضحة تمامًا في الصور ، حيث ينتشر الضوء تدريجيًا. ومع ذلك ، يمكننا العثور على الخط المشترك في الحواف ، وكبح باقي وحدات البكسل المحيطة به ، مما ينتج عنه خط فاصل نظيف ورفيع بدلاً من ذلك. يُعرف هذا باسم Non-Max Supression! يتم قمع وحدات البكسل غير القصوى (وحدات أصغر من تلك التي نقارنها في حقل محلي صغير ، مثل نواة 3 × 3). المفهوم قابل للتطبيق على مهام أكثر من هذا ، لكن دعنا نربطه بهذا السياق في الوقت الحالي.

عتبة التباطؤ

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

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

هذه عتبة التخلفية! في الواقع ، يساعد في تنظيف الناتج النهائي وإزالة الحواف الزائفة ، اعتمادًا على ما تصنفه على أنه حافة زائفة. للعثور على قيم حد جيدة ، ستختبر عمومًا حدودًا سفلية وعلوية مختلفة للحدود ، أو تستخدم طريقة آلية مثل طريقة أوتسو أو طريقة المثلث.

دعنا نحمّل الصورة ونقوم بتدريجها باللون الرمادي (Canny ، تمامًا كما يتطلب Sobel / Scharr الصور باللون الرمادي):

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

ستعمل الصورة المقربة للإصبع كأرضية اختبار جيدة لاكتشاف الحواف - ليس من السهل تمييز بصمة الإصبع من الصورة ، ولكن يمكننا تقريب بصمة الإصبع.

كشف الحواف على الصور باستخدام cv2.Canny ()

يمكن تطبيق خوارزمية كاني باستخدام OpenCV Canny() الأسلوب:

cv2.Canny(input_img, lower_bound, upper_bound)

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

قد يكون إيجاد التوازن الصحيح بين الحد الأدنى والحد الأعلى أمرًا صعبًا. إذا كان كلاهما منخفضًا - سيكون لديك بعض الحواف. إذا كان الحد الأدنى منخفضًا والعليا مرتفعًا ، فستحدث ضوضاء. إذا كان كلاهما مرتفعًا وقريبًا من بعضهما البعض - سيكون لديك القليل من الحواف. المكان الصحيح به فجوة كافية بين الحدود ، وجعلها في المقياس الصحيح. تجربة!

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


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

وينتج عنه:

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

قيم 20 و 30 هنا ليست عشوائية - لقد اختبرت الطريقة على معايير مختلفة ، واخترت مجموعة يبدو أنها تعطي نتيجة جيدة. هل يمكننا محاولة أتمتة هذا؟

حد آلي لـ cv2.Canny ()؟

هل يمكنك العثور على مجموعة مثالية من قيم العتبة؟ نعم ، لكنها لا تعمل دائمًا. يمكنك إجراء الحساب الخاص بك للحصول على قيمة جيدة ، ثم ضبط النطاق بامتداد sigma حول هذا الحد:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

متى sigma، على سبيل المثال ، 0.33 - ستكون الحدود 0.66*threshold و 1.33*threshold، مما يسمح بنطاق ~ 1/3 حوله. رغم ذلك ، فإن العثور على ملف threshold هو ما هو أكثر صعوبة. يوفر لنا OpenCV طريقة Otsu (تعمل بشكل رائع للصور ثنائية الوسائط) وطريقة المثلث. دعنا نجرب كلاهما ، بالإضافة إلى أخذ متوسط ​​بسيط لقيم البكسل كخيار ثالث:

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

وينتج عنه:

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

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

إذا قمنا بتشغيل ملف Canny() الطريقة مع نطاقات العتبة هذه:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

ملحوظة: تتوقع الدالة وسيطات متعددة ، وتكون عتباتنا عبارة عن مجموعة واحدة. نحن نقدر تدمير the tuple إلى وسيطات متعددة ببدءها بـ *. يعمل هذا أيضًا على القوائم والمجموعات ، وهو طريقة رائعة لتقديم حجج متعددة بعد الحصول عليها بوسائل برمجية.

وينتج عنه:

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

طريقة المثلث عملت بشكل جيد هنا! هذا لا يضمن أنه سيعمل بشكل جيد في حالات أخرى أيضًا.

اكتشاف الحواف في الوقت الفعلي على مقاطع الفيديو باستخدام cv2.Canny ()

أخيرًا ، دعنا نطبق اكتشاف حافة Canny على مقطع فيديو في الوقت الفعلي! سنعرض الفيديو قيد المعالجة (كل إطار كما يتم) باستخدام cv2.imshow() الذي يعرض نافذة بالإطار الذي نرغب في عرضه. على الرغم من ذلك ، سنقوم أيضًا بحفظ الفيديو في ملف MP4 يمكن فحصه ومشاركته لاحقًا.

لتحميل فيديو باستخدام OpenCV ، نستخدم ملف VideoCapture() طريقة. إذا مررنا 0 - سيتم التسجيل من كاميرا الويب الحالية ، حتى تتمكن من تشغيل الكود على كاميرا الويب الخاصة بك أيضًا! إذا قمت بتمرير اسم ملف ، فسيتم تحميل الملف:

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

edge_detection_video('secret_video.mp4')

VideoWriter يقبل العديد من المعلمات - اسم ملف الإخراج ، و FourCC (أربعة رموز ترميز ، تشير إلى برنامج الترميز المستخدم لتشفير الفيديو) ، ومعدل الإطارات والدقة كصفيف. لعدم تخمين الفيديو أو تغيير حجمه - استخدمنا عرض وارتفاع الفيديو الأصلي ، الذي تم الحصول عليه من خلال ملف VideoCapture المثال الذي يحتوي على بيانات حول الفيديو نفسه ، مثل العرض والارتفاع وإجمالي عدد الإطارات وما إلى ذلك.

أثناء فتح الالتقاط ، نحاول قراءة الإطار التالي باستخدام cap.read()، والذي يعرض رمز النتيجة والإطار التالي. رمز النتيجة هو True or False، مما يدل على وجود الإطار التالي أو عدم وجوده. فقط عندما يكون هناك إطار ، سنحاول معالجته بشكل أكبر ، وإلا فإننا سنكسر الحلقة. لكل إطار صالح ، نقوم بتشغيله من خلال تمويه gaussian ، وتحويله إلى تدرج الرمادي ، وتشغيله cv2.Canny() عليها واكتبها باستخدام ملف VideoWriter على القرص ، وعرض باستخدام cv2.imshow() لمشاهدة حية.

أخيرًا ، قمنا بإصدار برنامج الالتقاط وكاتب الفيديو ، حيث يعمل كلاهما مع الملفات الموجودة على القرص ، ويدمرون جميع النوافذ الموجودة.

عند تشغيل الطريقة بامتداد secret_video.mp4 الإدخال - سترى نافذة منبثقة وبمجرد الانتهاء ، ملف في دليل العمل الخاص بك:

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

وفي الختام

في هذا الدليل ، ألقينا نظرة على كيفية عمل اكتشاف الحواف ، والأجزاء المكونة لها - التنعيم الغاوسي ، ومرشحات سوبل وتدرجات الصور ، وعتبة عدم الحد الأقصى والتباطؤ. أخيرًا ، اكتشفنا طرقًا للبحث التلقائي عن نطاق العتبة لاكتشاف حافة Canny باستخدام cv2.Canny()، واستخدمت التقنية في مقطع فيديو ، مما يوفر ميزة اكتشاف الحافة في الوقت الفعلي وحفظ النتائج في ملف فيديو.

المضي قدمًا - التعلم العميق العملي لرؤية الكمبيوتر

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من الدورة: "التعلم العميق العملي لرؤية الكمبيوتر باستخدام Python".

كشف حافة OpenCV في لغة Python باستخدام ذكاء بيانات PlatoBlockchain ()cv2.Canny. البحث العمودي. منظمة العفو الدولية.

دورة أخرى في الرؤية الحاسوبية؟

لن نقوم بتصنيف أرقام MNIST أو أزياء MNIST. لقد خدموا دورهم منذ وقت طويل. يركز عدد كبير جدًا من موارد التعلم على مجموعات البيانات الأساسية والبنى الأساسية قبل السماح لبنى الصندوق الأسود المتقدمة بتحمل عبء الأداء.

نريد التركيز على إزالة الغموض, التطبيق العملي, فهم, حدس و مشاريع حقيقية. يرغب فى التعلم كيف يمكنك أن تحدث فرقا؟ سنأخذك في جولة من طريقة معالجة أدمغتنا للصور إلى كتابة مصنف تعليمي عميق من الدرجة البحثية لسرطان الثدي إلى شبكات التعلم العميق التي "تهلوس" ، وتعليمك المبادئ والنظرية من خلال العمل العملي ، وتزويدك الدراية والأدوات لتصبح خبيرًا في تطبيق التعلم العميق لحل رؤية الكمبيوتر.

ماذا يوجد في الداخل؟

  • المبادئ الأولى للرؤية وكيف يمكن تعليم أجهزة الكمبيوتر "الرؤية"
  • مهام وتطبيقات مختلفة للرؤية الحاسوبية
  • أدوات التجارة التي ستجعل عملك أسهل
  • البحث عن مجموعات البيانات وإنشائها واستخدامها للرؤية الحاسوبية
  • نظرية وتطبيق الشبكات العصبية التلافيفية
  • التعامل مع تحول المجال والتواجد المشترك والتحيزات الأخرى في مجموعات البيانات
  • نقل التعلم والاستفادة من وقت تدريب الآخرين والموارد الحسابية لصالحك
  • بناء وتدريب مصنف حديث لسرطان الثدي
  • كيفية تطبيق جرعة صحية من الشك على الأفكار السائدة وفهم الآثار المترتبة على التقنيات المعتمدة على نطاق واسع
  • تصور "الفضاء المفهوم" لـ ConvNet باستخدام t-SNE و PCA
  • دراسات حالة عن كيفية استخدام الشركات لتقنيات الرؤية الحاسوبية لتحقيق نتائج أفضل
  • تقييم النموذج المناسب ، تصور الفضاء الكامن وتحديد انتباه النموذج
  • إجراء بحث في المجال ومعالجة مجموعات البيانات الخاصة بك وإنشاء اختبارات نموذجية
  • أحدث البنيات ، تطور الأفكار ، ما الذي يجعلها فريدة من نوعها وكيفية تنفيذها
  • KerasCV - مكتبة العمل قيد التقدم لإنشاء خطوط الأنابيب والنماذج الحديثة
  • كيف تحلل وتقرأ الأوراق وتنفذها بنفسك
  • اختيار النماذج حسب التطبيق الخاص بك
  • إنشاء خط أنابيب تعلم آلي شامل
  • المناظر الطبيعية والحدس في اكتشاف الكائنات باستخدام شبكات R-CNN و RetinaNets و SSDs و YOLO أسرع
  • المثيل والتجزئة الدلالية
  • التعرف على الكائنات في الوقت الفعلي باستخدام YOLOv5
  • تدريب كاشفات الأجسام YOLOv5
  • العمل مع المحولات باستخدام KerasNLP (مكتبة WIP ذات قوة الصناعة)
  • دمج المحولات مع ConvNets لإنشاء تسميات توضيحية للصور
  • ديب دريم
  • تحسين نموذج التعلم العميق لرؤية الكمبيوتر

الطابع الزمني:

اكثر من ستاكابوز