تشخیص لبه بوسیله OpenCV و پایتون

تشخیص لبه (Edge Detection) یکی از مهمترین ک.ارها در پردازش تصویر است و به این منظور الگوریتم هایی نیز ارائه شده اند. در واقع با اعمال الگوریتم تشخیص لبه، میزان پیکسل های تصویر به منظور پردازش آن، کاهش می یابد ولی ساختار تصویر دست نخورده باقی می ماند. تشخیص لبه در برگیرنده عملیات ریاضی است که برای پیدا کردن نقاطی در تصویر استفاده می شود که روشنایی شدت پیکسل به طور قابل توجهی تغییر می کند.

۱ – تشخیص لبه سوبل

تشخیص لبه سوبل (Sobel Edge Detection) یک تشخیص دهنده (آشکار ساز) لبه مبتنی بر بر شیب، بر اساس مشتقات مرتبه اول است. این روش مشتقات تصویر را به طور جداگانه برای محورهای X و Y محاسبه می کند. آشکار ساز (تشخیص دهنده سوبل) در واقع عملگری است که دو کرنل 3x3 را به کار می گیرد که هر کدام از این دو کرنل در ادغام با تصویر اصلی، برای محاسبه مشتق های تقریبی یکی برای محور افقی و یکی برای محور عمودی مورد استفاده قرار می گیرند.

۲ – تشخیص دهنده لبه لاپلاسین

تشخیص دهنده لاپلاسین (Laplacian Edge Detection) بر خلاف سوبل، تنها از یک کرنل استفاده می کند. در واقع آشکار ساز لبه لاپلاسین، عملگری است که از مشتق درجه دوم را در یک فاز (بر روی محور افقی و عمودی) استفاده می کندسوبل و لاپلاسین هر دو عملگرهایی هستند که میزان تغییرات رنگ در نواحی (Region) متفاوت تصویر را نشان می دهند ولی به این دلیل که لاپلاسین مشتق دوم است، این کار را با حساسیت بیشتری انجام می دهد. توجه کنید در لاپلاسین مشتق دوم در راستای محور افقی و مشتق دوم در راستای محور عمودی، هر دو در یک فاز انجام می شوند.

در کدهای زیر و بوسیله کلاس های Sobel و Laplacian دو تشخیص (آشکار سازی) لبه را انجام داده ایم. کدهای زیر الگوی این دو کلاس (تابع های سازنده آنها) را نشان می دهد. آرگومان نخست هر دوی آنها، نام متغیری است که به ماتریس تصویر اشاره می کند.

آرگومان های متد Sobel

۱آرگومان نخست نام متغیری است که به ماتریس تصویری اشاره دارد.

۲آرگومان دوم عمق تصویر مقصد را نشان می دهد. توجه کنید که مقدار برگشتی متد ()Sebol در زبان پایتون یک ماتریس (آرایه n بعدی Numpy) و در زبان سی پلاس پلاس، از نوع Mat است. به عبارت دیگر مقدار برگشتی این متد، یک تصویر جدید است و از این رو آرگومان دوم (ddpeth)، عمق این تصویر برگشتی را تعیین می کند.

۳آرگومان های سوم و چهارم مشتق گیری در راستای محور X و محور Y را مشخص می کند. همانطور که توضیح دادیم، مشتق گیری در Sobel به صورت درجه اول است و به صورت مجزا و در دو گام بر روی محور افقی (x-axis) و محور عمودی (y-axis) انجام می شود.

بنابراین اگر می خواهیم مشتق گیری در راستای محور افقی باشد، باید آرگومان سوم برابر با عدد ۱ و ارگومان چهارم برابر با عدد صفر باشند. ولی اگر می خواهیم مشتق گیری در راستای محور عمودی باشد، باید آرگومان سوم برابر با عدد صفر و ارگومان چهارم برابر با عدد ۱ باشند.

۴آرگومان پنجم یا ksize اندازه کرنل را تعیین می کند و می تواند یکی از مقدار ۱ یا ۳ یا ۵ و یا ۷ را دریافت کند. در مثال های زیر ما از کرنل 5x5 استفاده کرده ایم ولی گفتیم که می توانیم از کرنل 3x3 نیز استفاده شود و حتی می توان از کرنل 7x7 نیز استفاده کرد.

آرگومان های متد Laplacian

۱آرگومان نخست نام متغیری است که به ماتریس تصویری اشاره دارد.

۲آرگومان دوم عمق تصویر مقصد را نشان می دهداگر مقدار آرگومان دوم دو متد بالا یعنی ddepth برابر با 1- باشد، عمق تصویر برگشتی با عمق تصویر اصلی یکسان خواهد بود. اما ممکن است بخواهید عمق تصویر برگشتی بیشتر از تصویر اصلی باشد.

کاربردهای تشخیص لبه

با توجه به گفته های بالا، تشخیص (آشکارسازی لبه ها) روشی است برای کاهش داده های (پیکسل های) تصویر، بدون آنکه ساختار تصویر تغییر پیدا کند. تشخیص لبه را می توانیم برای پیدا کردن اطلاع های مهم و مفیدی مانند curves، گوشه ها (Corners) و خط ها (Lines) به کار ببریم. همچنین همانطور که در مطلب های پیش رو توضیح داده ایم، از تشخیص لبه ها برای تشخیص اشیا (Recognizes Objects)، محدوده ها (Boundaries) و بخش بندی (Segmentation) استفاده کنیم.

در قطعه کد زیر ابتدا در خط ۷ از متد ()cvtColor برای تبدیل عکس رنگی (RGB) سه کانالی به تصویر خاکستری (Grayscale) تک کانالی استفاده شده است. سپس ماتریس تصویر برگشتی از اجرای متد در متغیر grayscaleImage ذخیره شده است. در خط ۹ و به منظور کاهش نویزها، متد (ی همان فیلتر) GaussianBlur بر روی ماتریس تصویر خاکستری اعمال و ماتریس برگشتی از اجرای متد ()GaussianBlur در متغیر image ذخیره شده است.

هموار سازی تصویر (کاهش نویزها) در OpenCV

سپس ماتریس متغیر image به متدهای Sobel و Laplacian در خط های ۱۱ و ۱۳ و ۱۵ برای پیاده سازی آشکار سازی های Sobel و Laplacian فرستاده شده است. توجه کنید خط های ۱۱ و ۱۳به ترتیب دو فاز آشکار سازی Sobel در راستاری محور X و Y را پیاده سازی کرده انددر نهایت در خط های ۱۸ تا ۳۰ و مطابق شکل زیر، از ویژگی های ماژول matplotlib.pyplot استفاده شده است تا ماتریس های ایجاد شده و به عبارت درست تر، تصویرهای ایجاد شده از کدهای بالا را را نمایش دهیم.

کد کامل برنامه

دریافت تصویر

دانلود سورس برنامه این مطلب Edge Detection opencv – Sobel and Laplacian

گام های انجام شده در کد بالا

گام ۱ – تبدیل تصویر از فضای رنگ BGR به فضای رنگ Grayscale توسط متد ()cvtColor

گام ۲ – اعمال متد ()guassianBlur بر روی تصویر خاکستری برای کاهش نویزها

گام ۳ – اعمال متد ()Sobel بر روی تصویر برای محاسبه مشتق درجه ۱ در راستای X در ماتریس تصویر خاکستری

گام ۴ – اعمال متد ()Sobel بر روی تصویر برای محاسبه مشتق درجه ۱ در راستای Y در ماتریس تصویر خاکستری

گام ۵ – اعمال متد ()Laplacian بر روی تصویر برای محاسبه مشتق درجه ۲ در هر دو راستای X و Y در یک گام

در این مطلب ما یک تصویر را از ورودی خواندیم ولی در مطلب های پیش رو نشان می دهیم که چکونه می توانیم از ویژگی های OpenCV برای تشخیص لبه در ویدیوها استفاده کنیم. به عبارت دیگر می توانیم از OpenCV لبه های درون فریم های بلادرنگ (Real Time) ویدیوها را نیز پیدا کنیم. همچنین مثال هایی را گفته ایم که هم برای تصویرها و هم برای ویدیوها، عملیات تشخیص اشیا را آموزش می دهند.