عملیات مورفولوژی از مقادیر پیکسل های همسایگی استفاده می کنند یعنی کرنل بیس هستند و هم به صورت تکرار شونده. در واقع شما این عملیات را از طریق یک structing element بر روی تصویر اعمال می کنید هر structing element دارای یک anchor یا همان لنگر می باشد که به صورت پیش فرض مرکز آن تعیین می گردد و به صورت دلخواه هم در کاربردهای خاص می توان مقدار دهی شود.
از جمله انواع structing element های موجود مربعی ، دایروی و لوزی هستش که شما می توانید ازش استفاده کنید یا می تونید خودتون دستی عناصر structing element ها را مقداردهی کنید.
این عملیات اغلب بر روی تصاویر باینری مورد استفاده قرار می گیرید و در برخی اوقات هم در تصاویر خاکستری.
به این نکته توجه داشته باشید که در پردازش تصویر آبجکت ها با سفید مقدار 255 و پشت زمینه با سیاه مقدار صفر نمایش داده می شود.
تصویر اولیه به صورت باینری
وقتی شما تصویر را dilate می کنید حجم آبکت ها زیاد و وقتی erode می کنید حجم آبجکت ها کم می گردد.
فرض کنید قصد دارید تصویر مبدا را dilate کرده و در تصویر مقصد بریزید شما کل تصویر مبدا را پیمایش کرده و به ازای هر پیکسل خانه های اطراف آن را جستجو کنید (یا به عبارت دقیق تر تمام خانه های structing element که سفید هستند چون در کرنل مربعی همه سفید هستند)
چنانچه حداقل یک پیکسل سفید در خانه های اطراف(یک مریع 3*3) وجود داشته باشد نقطه جاری در تصویر مقصد سفید و در غیر اینصورت سیاه خواهد بود.حال این تعریف در تصویر خاکستری به صورت دیگری تعریف میشه در تصویر خاکستری شما همسایه که دارای بیشترین مقدار هستش را پیدا کرده و مقدارش را در تصویر مقصد قرار می دید.
تصویر dilate شده
cv::dilate(image,dilated,cv::Mat());
در عملیات erode این قضیه برعکس خواهد بود چنانچه حداقل یک پیکسل سیاه در اطراف هر نقطه وجود داشته باشد در تصویر مقصد سیاه در غیر اینصورت سفید قرار دهید. و در تصویر خاکستری هم کوچکترین مقدار همسایگی را در تصویر مقصد قرار می دید.
تصویر erode شده
cv::Mat element(7,7,CV_8U,cv::Scalar(1));
cv::erode(image,eroded,element);
حال میرسیم به عملیات opening و closing :هر گاه شما نیاز داشته باشید قسمت کوچک تصویر را به گروه های بزرگتر(بلاب های بزرگ) بچسبانید و یا بر عکس
زمانیکه نیاز داشته باشید تکه کوچک را قسمت های بزرگ جدا کنید و یا اینکه نویز ها و یا حفره های موجود در آبجکت ها را پر کنیم از این عملیات استفاده می کنیم.
Closing زمانیکه شما قصد داشته باشید حفره های موجود در آبجکت حذف شه و یا و یا یک خط نازک چسبیده به آبجکت بزرگ را حذف کنید از این عملگر استفاده می کنید این عملگر خودش به ترتیب از عملگر dilate و erode استفاده می کند.
تصویر close شده
cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
cv::Mat closed;
cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);
Opening زمانیکه شما قصد داشته باشید آبجکت های کوچک در تصویر تحت عنوان نویزرا از تصویر حذف کنید از این عملگر استفاده می کنید که خود آن به ترتیب از 2 عملگر erode و dilate استفاده می کند.
تصویر Open شده
cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
cv::Mat closed;
cv::morphologyEx(image,closed,cv::MORPH_OPEN,element5);
علت استفاده پست سرهم 2 عملگر dilate و erode در عملگر ها Opening و closing به این خاطر است که شکل ظاهری آبجکت تغییرات زیادی با نسخه اولیه نداشته باشد.