امروزه با کمک پردازش تصویر و هوش مصنوعی میتوان تحلیلهای عمیقی انجام داد. تشخیص چهره، تشخیص چشم، تشخیص خودرو و … از این دسته از تحلیلها میباشند. اما پردازش تصویر چگونه انجام میگیرد یا چگونه میتوان آن را پیاده سازی کرد. امروز در همین خصوص، وارد مبحث تشخیص لبه canny در OpenCV خواهیم شد.
ماژول opencv
Opencv یکی از ماژولهای پردازش تصویر و هوش مصنوعی میباشد. با کمک این ماژول میتوان تصاویر را دریافت و بسیاری از عملیاتهای پردازش تصویر را پیاده سازی کرد. جالب است بدانید با opencv میتوان تشخیص چهره، تشخیص چشم و یا حتی تشخیص اعداد را نیز انجام داد. علاوه بر تصاویر، پردازش ویدئو نیز میتوان با کمک این ماژول انجام داد. در این مقاله، تشخیص لبه canny را با کمک OPENCV و زبان برنامهنویسی پایتون پیادهسازی خواهیم کرد. البته بعضی از قسمتها به موجب نیاز، از ماژول Numpy نیز استفاده میگردد. Pdf آموزش Numpy از این لینک میتوانید تهیه نمایید.
تشخیص لبه
تشخیص لبه در پردازش تصویر فرآیندی است که در آن تغییرات ناگهانی پیکسل را تشخیص و آن را به عنوان لبه جداسازی میکند. (البته به این راحتی نیست انجام دادنش!) تشخیص لبه را با یک مثال نشان میدهیم:
سمت چپ تصویر اصلی قرار داده شده و در سمت راست تصویر بعد از تشخیص لبه، همانطور که مشاهده میکنید تشخیص لبه سعی میکند حاشیهها یا همان لبههای اشیا در تصویر را تشخیص دهد و آن را جداسازی نماید. در این مقاله تشخیص لبه Canny را در OpenCV بررسی خواهیم کرد.
تشخیص لبه Canny در Opencv
تشخیص لبه Canny روشی بسیار معروف است و در پردازش تصویر، بینایی ماشین از آن به مراتب استفاده میشود. با توجه به پیچیدگی روش Canny و پیشنیازهای بسیار آن، در این مقاله وارد جزییات(اثبات ریاضی) فرآیند تشخیص لبه Canny نخواهیم شد. در ماژول OpenCV تابعی به نام Canny وجود دارد. این تابع تشخیص لبه Canny را پیاده سازی نموده و با استفاده از آن میتوان عملیات تشخیص لبه را انجام داد. ورودیهای این تابع به صورت زیر است:
- Src: تصویر ورودی
- T_lower یا Lower Threshold
- T_upper یا Higher Threshold
- L2Gradient: به صورت پیش فرض false است و اگر مقدار آن را true کنیم از عملیات های ریاضی پیچیدهتری برای تشخیص لبه استفاده میشود که البته دقت بالاتری داشته اما زمان بیشتری نیز خواهد گرفت.
برای تشخیص لبه Canny نیاز است دو مقدار Lower Threshold و Higher Threshold را مشخص کنیم. اگر مقدار گرادیان پیکسل بیشتر از Higher Threshold باشد آن پیکسل لبه تشخیص داده میشود و اگر مقدار گرادیان پیکسل کمتر از Lower Threshold باشد به عنوان لبه تشخیص داده نمیشود.
فراخوانی تصویر
ما قبل از هر اقدامی نیاز است ماژولهای مورد نیاز را فراخوانی نماییم:
import cv2
import numpy as np
در این قسمت تصویر ورودی را ابتدا میخوانیم:
image = cv2.imread(binary.jpg',0)
cv2.imshow("Original", image)
تصویر ورودی به صورت زیر میباشد:
تصویر ورودی لوگوی وبسایت کدگیت میباشد. این تصویر به صورت grayscale خواندیم(تصویر بالا، تصویر orginal است).
پیادهسازی تشخیص لبه canny در opencv
برای پیاده سازی تشخیص لبه بایت تابع canny را صدا بزنیم:
تابع canny را با سه ورودی image (تصویر ورودی) و 100 (lower threshold) و 120 (higher threshold) صدا زدیم. خروجی تصویر به صورت زیر است:
همانطور که در تصویر مشخص است لبههای لوگوی وبسایت کدگیت جداسازی شده است. تصویر دومی که میخواهیم برای تست به برنامه بدهیم به صورت زیر میباشد:
سورس کد را مشاهده کنید:
سورس کد مانند قبل است اما میزان Threshold را به اعداد 180 و 200 تغییر دادهایم. خروجی را مشاهده کنید:
تصویر فوق در قسمت پایین، لبهها تشخیص داده نشده است. بدلیل انتخاب threshold این اتفاق افتاده است. threshold را به اعداد 50 و 200 تغییر میدهیم:
canny = cv2.Canny(image, 50, 200)
cv2.imshow('Canny 3', canny)
خروجی کد بالا به صورت زیر است:
میزان تشخیص لبه در این قسمت بسیار بیشتر از حالت قبل است. ما باید یک حد وسط برای threshold انتخاب کنیم. انتخاب threshold بر اساس مسئله شما متفاوت است. پس حتماً در انتخاب آن دقت کنید.