تفاوت عملیات مورفولوژی Opening و Closing - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تفاوت عملیات مورفولوژی Opening و Closing

0 امتیاز
در مبحث morphology یا ریخت شناسی 2 مبحث گشودن وبستن چه کاربردی و استفاده ای دارد.

 

مممنون
سوال شده اردیبهشت 6, 1394  بوسیله ی نظری (امتیاز 62)   5 10 13

1 پاسخ

+2 امتیاز
 
بهترین پاسخ
عملیات مورفولوژی از مقادیر پیکسل های همسایگی استفاده می کنند یعنی کرنل بیس هستند و هم به صورت تکرار شونده. در واقع شما این عملیات را از طریق یک 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 به این خاطر است که شکل ظاهری آبجکت تغییرات زیادی با نسخه اولیه نداشته باشد.
پاسخ داده شده اردیبهشت 6, 1394 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ویرایش شده اردیبهشت 6, 1394 بوسیله ی مصطفی ساتکی
مهندس سلام.
اگه امکان داره از توابع نام برده مثال هم بزنید با تشکر.
تصاویری که dilate شدن می تونیم طوری تنظیمش کنیم که فقط از یک سمت اضافه بشه مثلا یک خط راست حالا می خوایم به سمت چپ این خط اضافه کنیم. یا از سمت چپ حجمش رو اضافه کنیم.
با تشکر
یه سئوال دیگه:
cv::dilate(image,dilated,cv::Mat());
چرا dilate رو نمیشناسه؟
cv:: این چیه؟
mat() چیه؟
با تشگر
شما اول باید OpenCV را نصب کنید.سپس هدر های core.hpp و imgproc.hpp را include کنید.
cv:: هم namespace اصلی کتابخانه است.
mat() یعنی یک تصویر خالی.
...