عملیات های ریخت شناسی (Morphological Operations) دسته ای از عملیات های غیر خطی در پردازش تصویر هستند که با شکل های تصویر یا ریخت شناسی ویژگی های تصویر مانند مرزها (Boundaries) در ارتباط هستند. عملیات های ریخت شناسی به طور معمول بر روی تصویرهای دودویی (Binary Image) اعمال می شوند به طوری که در تصویرهای دودویی، پیش زمینه ها (Foreground) به رنگ سفید و پس زمینه ها (Background) به رنگ سیاه هستند.

تبدیل تصویر رنگی به تصویر دودویی

عملیات های ریخت شناسی دو ورودی را دریافت می کنند که یکی تصویر اصلی و دیگری عنصر یا المان ساختاری (Structuring Element) یا کرنل (Kernel) است که به تصویر اصلی اعمال شده تا تصویر جدید به عنوان خروجی ایجاد شود. در ادامه دو نمونه از عملیات های ریخت شناسی اساسی به نام Eroding و Dilation را آموزش داده ایم.

در Eroding، مرزهای شی های پیش زمینه (Foreground Objects) از میان می روند و آنرا نازک تر می کند. دلیل اینکه پیش زمینه سفید در Eroding نازک تر می شود، به این خاطر است که، تمامی پیکسل های در مرز پیش زمینه سفید، با 0 مقدار دهی می شوند. عملیات Dilation دقیقا عکس Eroding است، به این صورت که پیکسل های مرز پیش زمینه سفید، ضخیم تر (پهن تر) می شوند، به این خاطر که تمامی پیکسل های مرز پیش زمینه سفید با 1 مقدار دهی می شوند.

تابع ()erode در OpenCV

ایده اصلی Eroding (یا فرسایش) درست همانند فرسایش خاک است، و بدین گونه است که مرزهای شیء پیش زمینه (Background Object) را از میان می برد. در این عملیات و همچنین عملیات Dilation (گشایش)، یک کرنل (یا ماتریس کانولوشن) nxn بر روی تصویر حرکت می کند. یک پیکسل در تصویر اصلی (1 یا 0) تنها 1 در نظر گرفته خواهد شد، در صورتی که تمام پیکسل ها در زیر هسته 1 باشد، در غیر این صورت، فرسودگی (فرسایش) می شود که به معنی صفر شدن پیکسل است.

فیلتر تصویر و مفهوم کرنل در پردازش تصویر

بنابراین آنچه که رخ می دهد این است که، همه پیکسل ها در نزدیکی مرز (Near Boundary) بسته به اندازه هسته دور انداخته می شوند یا به گفته دیگر، مقدار پیکسل صفر یا تاریک ترین رنگ سیاه را دریافت می کنند. بنابراین ضخامت (Thickness) یا اندازه (Size) شیء پیش زمینه کاهش (Decreases) می یابد و یا به سادگی ناحیه (Region) سفید در تصویر کاهش می یابد. کاربردهای آن را می توانیم به موردهای زیر اشاره کنیم:

  • از میان بردن نویز سفید کوچک
  • جدا کردن دو شی متصل (Detach two connected objects)

در OpenCV تابع erode برای انجام عملیات Eroding (یا عملیات گسایش) به کار گرفته می شود. آرگومان نخست آن تصویر ورودی و آرگومان دوم آن کرنلی است که بر روی تصویر ورودی انجام می شود تا تصویر خروجی ساخته شود. در کد زیر نخست بدست متد ()ones از ماژول Numpy یک کرنل ۵x۵ از شماره های ساخته ایم و سپس آن را به آرگومان دوم تابع ()erode فرستاده ایم. نتیجه تابع، تصویر فرسایش یافته است که در متغیر erosion نگهداری می شود.

ایجاد آرایه ها بوسیله ماژول NumPy – آموزش تابع ()onse در NumPy

تابع ()dilation در OpenCV

همانگونه که گفتیم رفتار و کاربرد Dilation وارونه Eroding است. در اینجا یک مقدار پیکسل در محلی در تصویر خروجی شماره 1 است، اگر دست کم یک پیکسل در زیر هسته برابر با شماره 1 باشد. بنابراین ناحیه سفید را در تصویر و یا حجم پیش زمینه افزایش می یابد. بنابراین می بینید که Dilation وارونه Eroding است. در حذف نویزها، معمولا پس از عملیات Eroding، عملیات Dilation انجام می شود. دلیل این است که Erding نویزهای سفید را از میان می برد ولی از سوی دیگر شی درون تصویر را کوچک (Shrinks) می کند. بنابراین پس از حذف نویزها، می بایست عملیات Dilation را بر روی تصویر خروجی Eroding انجام دهیم.

در OpenCV تابع ()dilation برای انجام عملیات Dilation (یا گُسایش) به کار می رود. همانند تابع ()erode، آرگومان نخست آن نام متغیری است که به ماتریس تصویر ورودی اشاره دارد و آرگومان دوم آن هسته ای است که می خواهیم بر روی تصویر ورودی انجام دهیم تا تصویر خروجی ساخته شود. توجه کنید در زیر هم فرض کردیم که تصویر را خوانده ایم و سپس یک کرنه ۵x۵ نیز ساخته ایم که آن را در متغیری به نام kernel نگهداری می کنیم.

در کد زیر نخست با تابع ()cvtColor فریم های ویدیو دوربین رایانه را از فضای رنگ BG2 به HSV تبدیل می کنیم. سپس می خواهیم یک ماسک تصویر برای رنگ قرمز بسازیم، زیرا می خواهیم شی هندسی قرمز رنگ در تصویر را تشخیص دهیم. ماسک تصویر را به کمک تابع های ()inRange و ()bitwise_and می سازیم. پیوند زیر را می توانید برای فهمیدن ماسک تصویر بخوانید. سپس یک کرنل ۵x۵ ساخته ایم و نخست و برای از میان بردن نویزهای سفید، تابع ()erode فراخوانی شده است و به دنبال آن تابع ()dilate را فراخوانی کرده ایم.

تشخیص اشیا توسط رنگ در تصویر با OpenCV

دانلود سورس کد این نوشته OpenCV Eroding and Dilation