برنامه اصلی در فایل main.m قرار دارد.
ورودی برنامه یک تصویر ترجیحا برش خورده و بدون اطلاعات اضافی می باشد. که در متغیر image قرار میگیرید.
پس از آن ماسک های مختلفی که برای هر رنگ ایجاد شده است برروی تصویر اعمال میشود و ماسک باینری رنگ مد نظر به همراه ارتفاع میانگین ماسک که جهت محاسبه ترتیب اورینگ ها استفاده خواهد شد برگردانده می شود.
پس از آن با استفاده از ماسک ها زاویه رینگ ها و سپس وجود و یا عدم وجود رینگ ها بررسی می شود و به عنوان تایتل و یا لیبل عکس نتایج نمایش داده خواهند شد.
ابتدا برروی ماسک یک جمع به صورت ردیفی اعمال میشود تا طول هریک از ردیف های رینگ مشخص شود سپس با استفاده از تابع find ایندکس خانه هایی که مجموع آنها بالاتر از ۰ باشد را محاسبه میکنیم. و میانگین ایندکس این خانه ها برابر میانگین ارتفاع رینگ بر اساس اندازه تصویر میباشد.
از این روش در تمامی ماسک ها استفاده شده است.
ابتدا با استفاده از ابزار colorThresholder برای رنگ های مختلف یک حد مشخص ایجاد شده است و سپس بر اساس شرایط تصاویر هریک از ماسک ها شخصی سازی شده است تا بهترین نتیجه حاصل شود.
برروی تمامی ماسک ها یک تابع imopen با پنجره مربعی ۵ در ۵ اعمال شده است تا نویز های اضافی ماسک حذف شود و نتیجه نهایی با دقت بالا نمایش داده شود.
به دلیل فلاش دوربین و نزدیکی رنگ رینگ زرد و پایه به رنگ سفید در ماسک سفید با استفاده از مشخصه های محلی در کنار ماسک رنگی رینگ سفید از دیگر رینگ ها متمایز شده است. ابتدا ریجن های سفید رنگ بر اساس MajorAxisLength که طول بزرگترین محور را در اختیار میگذارند محدود شده اند تا در صورتیکه رینگ سفید وجود نداشت نواحی کوچک رنگ سفید به عنوان رینگ شناسایی نشوند.
سپس با استفاده از مقدار Area بزرگترین ناحیه سفید رنگ به عنوان رینگ انتخاب میشود.
معمولا با محدود کردن MajorAxisLength رینگ سفید به درستی تشخیص داده میشود ولی به دلیل افزایش دقت و به دلیل اینکه ماسک سفید رنگ رینگ را به بزرگترین حالت ممکن انتخاب میکند شرط دوم نیز اعمال شده است.
در ماسک سیاه برخلاف دیگر ماسک ها به جای colorThresholder از ابزار imageSegmenter استفاده شده و بر اساس اندازه و شکل مستطیلی طور رینگ مشکی یک سگمنت بر اساس گراف برروی تصویر اعمال شده که با دقت نسبتا بالایی رینگ سیاه را میتواند تشخیص دهد.
با استفاده از ماسک رنگ سیاه که با دقت نسبتا بالایی لبه های رینگ سیاه را تشخیص میدهد. طول رینگ محاسبه میشود. بعد از محاسبه طول رینگ با حذف طول های صفر تنها ناحیه شامل رینگ سیاه انتخاب میشود. بیشترین طول در این بازه محاسبه میشود و در صورتیکه این نقطه در نیمه پایین رینگ باشد یعنی رینگ درست قرار گرفته در غیر اینصورت رینگ در جای درست قرار ندارد.
در بخش تشخیص زاویه ما سه عدد ماسک که متعلق به رینگ های آبی و زرد و سفید می باشد دریافت میکنیم.
سپس در هر یک از ماسک ها بزرگترین ناحیه انتخاب میشود و زاویه این ناحیه با استفاده از متغیر Orientation محاسبه می شود.
در صورتیکه زاویه یکی از رینگ ها بیشتر از ۱ واحد باشد برنامه خطا اعلام میکند.
برای این بخش نیز مجددا ماسک مربوط به رنگ رینگ به فانکشن به عنوان متغیر ورودی داده میشود و نتیجه عدم وجود رینگ برگشت داده می شود.
برای تشخیص نبود رینگ ابتدا با استفاده از متغیر های Area و MajorAxisLength مناطق داخل ماسک را محدود میکنیم و سپس بزرگترین ناحیه را میگیریم اگر ناحیه ای برگردانده شده باشد یعنی رینگ وجود دارد و در صورتیکه ناحیه ای در نتیجه محدود سازی برگشت داده نشود یعنی رینگ وجود ندارد.