در مطلب تشخیص لبه بوسیله OpenCV و پایتون تا اندازه ای در مورد روش های سوبل (Sobel) و لاپلاسین (Laplacian) برای تشخیص لبه در OpenCV صحبت کردیم. روش سوبل لبه ها را با مشتق گیری درجه ۱و به صورت مجزا برای دو راستای X و Y محاسبه می کند و به این معنی است که یک دید جامع از لبه ها را بر اختیار ما قرار نمی دهد. بنابراین برای پوشش آن از روش لاپلاسین استفاده می کنیم که از طریق مشتق گیری درجه ۲ و به صورت یک گام برای هر دو راستای افقی و عمودی، لبه ها را تشخیص می دهد.

اما همانطور که در تصویر زیر نشان داده شده است، روش لاپلاسین، باعث ایجاد نویزهای فراوانی در تصویر (یا ویدیو) خروجی می شود،. برای پوشش دادن این مشکل، روش Canny به میان می آید. در این مطلب و در ادامه بحث مربوط به تشخیص لبه، می خواهیم در مورد روش Canny صحبت کنیم. الگوریتم Canny در سال ۱۹۸۶ توسط John F. Canny ارائه شده است. درون الگوریتم Canny چهار گام زیر رخ می دهد:

گام ۱ – کاهش نویزها (Noise Reduction) توسط فیلتر Guassian Blur و به طور مثال استفاده از یک کرنل 5x5 که شکل ماتریس آن در زیر آمده است.

گام ۲ – محاسبه و پیدا کردن شدت گرادیان تصویر. گرادیان تصویر (Image Gradient) یک تغییر جهت در شدت (Intensity) یا رنگ در یک تصویر است. مفهوم گردایان در پردازش تصویر بسیار پر اهمیت است و به طور نمونه در بحث تشخیص لبه ها و درالگوریتم Canny مورد استفاده قرار می گیرد. گرادیان تصویر توسط اعمال فیلترهایی روی تصویر اصلی ایجاد می شوند. در مورد روش Canny و برای تشخیص لبه ها، یک روش مشابه فیلتر سوبل استفاده می شود. به این معنی که گرادیان در دو راستای X و Y محاسبه می شود.

گام ۳ – Non-Max Suppression تعیین می کند که آیا پیکسل نسبت به همسایگان خودش ()، نامزد بهتری است برای یک لبه. Non-Maximum Suppression (یا NMS) در بسیاری از جنبه های بینایی ماشین (Computer Vision) مانند تشخیص لبه (Edge Detection)، تشخیص گوشه (Corner Detection) و تشخیص اشیا (Object Detection) کاربرد دارد. یکی از مشکل های تشخیص اشیا، این است که الگوریتم شما ممکن است چندین تشخیص از شی (Objects) مشابه را پیدا کند. هدف از NMS در تشخیص اشیا این است که اطمینان داده شود یک شی تنها یک مرتبه تشخیص داده شده باشد.

گام ۴ – آستانه گذاری هیسترزیس شروع و پایان لبه را پیدا می کند.

پارامترهای الگوریتم Canny

الگوریتم Canny شامل تعدادی پارامتر قابل تنظیم است که می تواند بر محاسبه زمان و کارایی الگوریتم تاثیر بگذارد.

۱ – اندازه فیلتر گاوسی: فیلتر هموار سازی که در مرحله اول استفاده می شود (کاهش نویزها)، به طور مستقیم بر نتایج الگوریتم Canny تاثیر می گذارد. فیلترهای کوچکتر باعث مات شدن (Bluring) کمتری می شوند و اجازه می دهد تا الگوریتم Canny، خطوط کوچک و تیز (Small and Sharp Lines) را تشخیص دهند. یک فیلتر بزرگتر موجب تارشدگی (مات شدن) بیشتر می شود و از این رو ارزش یک پیکسل را در یک ناحیه بزرگتر از تصویر از بین می برد.

۲ – آستانه: یک آستانه (Thresholds) بیشترین حد از اطلاعات مهم را که می توانند از دست بروند را تنظیم می کند. یک آستانه تعیین شده خیلی کوچک، اطلاعات نامناسب (مانند نویزها) را به عنوان اطلاعات مهم، شناسایی می کند. البته هیچ آستانه عمومی و آزمایش شده وجود ندارد که بتوانیم آنرا برای تمامی تصویرها استفاده کنیم، پس بهتر است در OpenCV ار Trackbar ها برای تعیین محدود آستانه استفاده شود.

ایجاد Trackbar در OpenCV

کد زیر الگو متد سازنده کلاس Canny را نشان می دهد.

در کدهای زیر از Trackbar ها برای تعیین آستانه پایین و آستانه بالا در ()Canny استفاده شده است. مقدار این دو Trackbar میان بازه صفر تا ۵۰۰ است. توجه کنید آرگومان اول نام متغیری است که ماتریس تصویر را در خود ذخیره می کند و دو آرگومان دیگر به ترتیب آستانه پایین را مشخص می کنند.