امروزه با کمک پردازش تصویر و هوش مصنوعی میتوان تحلیلهای عمیقی انجام داد. تشخیص چهره، تشخیص چشم، تشخیص خودرو و … از این دسته از تحلیلها میباشند. اما پردازش تصویر چگونه انجام میگیرد یا چگونه میتوان آن را پیاده سازی کرد. امروز در همین خصوص، وارد مبحث گرادیان تصاویر در پردازش تصویر خواهیم شد.
گرادیان تصویر
گرادیان تصویر در بسیاری از پروژههای بینایی ماشین و پردازش تصویر استفاده میشود. یکی از مهمترین کاربردهای آن در تشخیص لبه یا edge detection میباشد. در تشخیص لبه، حاشیههای موجود در تصویر جداسازی شده و اطلاعات مهمی از تصویر دریافت میگردد. با این تفاسیر میتوان گفت گرادیان تصویر بخش مهمی از پردازش تصویر را انجام میدهد. در تصویر زیر نمونهای از تشخیص لبه را آوردهایم.
در تصویر سمت چپ یک یادداشت با واژه Hello را میبینید و در سمت راست تصویر پس از اعمال جداسازی لبه را مشاهده مینمایید. با جداسازی لبه، تقریباً تمام ساختار این تصویر را میتوان مشاهده و جداسازی کرد. یک مستطیل که برگه یادداشت بوده و کلمه Hello که درون برگه یادداشت قرار دارد.
محاسبه گرادیان تصویر
برای محاسبه گرادیان تصویر ابتدا میبایست تعریف آن را بدانیم. به زبان ساده گرادیان تصویر، تغییر جهت در شدت تصویر تعریف می شود. منظور از شدت تصویر چیست؟ پیکسلهای یک تصویر grayscale را در نظر بگیرید. گرادیان میزان تغییر شدت پیکسل در جهت معین را محاسبه میکند. حال سوال اینجاست تغییر شدت پیکسل چگونه محاسبه میشود؟ برای این کار دو پارامتر gradient magnitude و gradient orientation را تعریف میکنند. در ادامه با این دو پارامتر آشنا خواهیم شد.
در واقعیت گرادیان با استفاده از Kernel محاسبه میشود. در این مقاله ابتدا بدون kernel مقدار گرادیان را محاسبه میکنیم. سپس به معرفی روش Kernel خواهیم پرداخت. هدف ما پیدا کردن تغییر شدت پیکسل وسط (قرمز رنگ) در دو محور x و y میباشد:
ابتدا باید همسایگیهای پیکسل را بدست آوریم:
در تصویر بالا همسایگی 3*3 را در نظر گرفتیم. پیکسلهای مهم شامل جهتهای شمال (North)، جنوب (South)، غرب (West) و شرق (East) میباشند. برای محاسبه گرادیان از این پیکسلها استفاده خواهیم کرد. محور x از سمت چپ(West) به راست(east) بوده و محور y از بالا(North) به سمت پایین(south) است. تصویر ورودی را I نامگذاری و نقطه قرمز رنگ را I(x,y) مینامیم. چهار پیکسل همسایه را به صورت زیر مینویسیم:
- شمال: I(x, y – 1)
- جنوب: I(x, y + 1)
- شرق: I(x + 1, y)
- غرب: I(x – 1, y)
برای محاسبه تغییر شدت پیکسل در محور Y از فرمول زیر استفاده میکنیم:
Gy = I(x, y + 1) – I(x, y − 1)
برای محاسبه تغییر شدت پیکسل در محور X نیز از فرمول زیر استفاده میشود:
Gx = I(x + 1, y) – I(x − 1, y)
حال که با فرمولهای بالا آشنا شدیم. به سراغ gradient magnitude و gradient orientation میرویم. gradient magnitude تعیین میکند به چه میزانی (قدرتی) تغییر شدت پیکسل انجام گرفته و gradient orientation مشخص میکند در چه جهتی تغییرات شدت پیکسل بوده است.
در تصویر فوق میتوان دید که gradient orientation به چه صورتی است. تصویر سمت چپ پیکسلهای پایین مشکی و پیکسلهای بالا سفید رنگ هستند. به همین دلیل gradient orientation مقدار 90- میباشد (دقت کنید دلیل منفی بودن زاویه، جهت محور مختصات در تصاویر است). تصویر سمت راست اما پیکسلهای سیاه رنگ و سفید رنگ طوری قرار گرفتهاند که gradient orientation مقدار 45- میباشد.
تصویر زیر را ببینید:
میخواهیم gradient orientation و gradient magnitude پیکسل قرمز رنگ را بدست آوریم. همانطور که گفتیم gradient magnitude میزان تغییر شدت پیکسل را تعیین میکند. خوشبختانه ما در قسمت قبل در دو محور X و Y آن را بدست آوردیم یعنی Gy و Gx حال تنها کافیست با مثلث قائمالزاویه آشنا باشیم.
برای بدست آوردن G از فرمول زیر استفاده میکنیم:
برای بدست آوردن θ از فرمول زیر استفاده میشود:
البته برای بدست آوردن θ باید از Tan-1 استفاده کرد اما چون مقدار آن ممکن است تعریف نشده گردد از فرمول بالا استفاده میکنیم. همچنین پاسخ arctan به صورت رادیان بوده به همین دلیل آن را به درجه تبدیل کردیم (ضرب ).
محاسبه گرادیان با Kernel
در این قسمت ما برای محاسبه گرادیان از Kernel استفاده خواهیم کرد. روش Kernel با بدست آوردن تقریبی گرادیان، زمان محاسبه آن را بسیار کاهش داده است. دو kernel برای محاسبه گرادیان وجود دارد:
- sobel
- Scharr
Kernel روش sobel به صورت زیر است:
در حقیقت در روش sobel از دو kernel برای محاسبه Gx و Gy استفاده میشود. یکی در محور X و دیگری در محور Y میباشد. یک مثال ساده از این روش را با هم ببینیم:
پیکسلهای ما به صورت بالا هستند. حال Gx و Gy را با روش sobel محاسبه میکنیم:
حال میتوانیم gradient magnitude و gradient orientation را محاسبه کنیم:
همانطور که مشاهده کردید روش Kernel بسیار سریعتر از روش قبل است. و به طور معمول از روش Kernel در واقعیت استفاده میشود دلیل آن نیز همانطور که گفتیم سرعت بالای محاسبه گرادیان در این روش است. روشScharr نیز از Kernel استفاده میکند. Kernelهای آه به صورت زیر هستند:
روشScharr نتیجه بهتری را نسبت به روش sobel در اختیار ما قرار میدهد. انجام محاسبات روشScharr بر روی پیکسلهای تصویر زیر را به شما میسپاریم(به عنوان تمرین).