تخفیف ویژه ماه مبارک رمضان، فرصت یادگیری با 35٪ تخفیف (کد تخفیف: ramazan)

سبد خرید (0)

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

در این مقاله قصد داریم که تعداد دایره های(سوراخ های) یک مدار الکتریکی ساده را با استفاده از پردازش تصویر در نرم افزار متلب، بیابیم.  برای انجام این کار تصویر زیر را در نظر بگیرید:

کاری که می خواهیم انجام دهیم این است که تعداد دایره ها(سوراخ های) این عکس را به دست بیاوریم. پس اول این عکس را دانلود کنید، و در پوشه ای قرار دهید. حالا در متلب، در بخش Current Folder به این پوشه بروید. حالا با استفاده از دستورات زیر این عکس را می خوانیم و سپس نمایش می دهیم:

image = imread('cir.png');
imshow(image)

 با اجرای دستورات بالا، عکس ما خوانده شده و نمایش داده خواهد شد، بصورت زیر:

 حالا می خواهیم این عکس را به یک عکس باینری تبدیل کنیم. از دستورات زیر استفاده می کنیم و مقدار آستانه را برابر با 0.4 در نظر می گیریم:

bin = im2bw(image,0.4);
imshow(bin)

 عکس ما به صورت زیر نشان داده خواهد شد:

 حالا می خواهیم با استفاده از دستور imfindcircles تعداد دایره ها را به دست بیاوریم. و برای اینکه مشخص کنیم که می خواهیم به دنبال دایره های سیاه بگردیم، پارامتر ObjectPolarity را به dark ست می کنیم. و مشخص می کنیم که مرکز این دایره ها در داخل متغیر centers و شعاع این دایره های یافت شده در متغیر radii ذخیره شوند:

[centers, radii] = imfindcircles(bin,[7 12],'ObjectPolarity','dark')

اما همان طور که در تصویر زیر مشاهده می کنید، هیچ دایره ای پیدا نمی شود و متغیرها خالی هستند:

برای اینکه دایره ها پیدا شوند، باید دقت این دستور بالا را زیاد کنیم. با استفاده از پارامتر Sensitivity که مقداری بین 0 و 1 می پذیرد، می توانیم دقت دستور imfindcircles را زیاد کنیم. هرچه عدد ما به 1 نزدیک تر شود،دقت زیادتر می شود، داریم:

[centers, radii] = imfindcircles(bin,[7 12],'ObjectPolarity','dark','Sensitivity',0.94)

اکنون مشاهده می کنید که تعدادی دایره یافت می شوند و مرکز و شعاع آنها نمایش داده می شوند. توجه کنید که در دستور بالا، اعداد 7 و 12، مشخص کننده ی حداقل و حداکثر شعاع های دایره ها هستند: 

 حالا برای اینکه دایره ی های پیدا شده را در داخل تصویر اصلی مشاهده کنیم، دستورات زیر را وارد کنید:

imshow(image);
h = viscircles(centers,radii);

 حاصل به صورت زیر خواهد بود:

 

 همان طور که مشاهده می کنید، برخی از دایره ها اصلا پیدا نشده اند، و تعدادی از دایره ها هم بر روی هم افتاده اند، و دو دایره محسوب شده اند، بنابراین شعاع و حساسیت(دقت) را بیشتر می کنیم: 

[centers, radii] = imfindcircles(bin,[13 15],'ObjectPolarity','dark','Sensitivity',0.97);
imshow(image);
h = viscircles(centers,radii);

 نتیجه به صورت زیر خواهد بود: 

 

 حالا برای محاسبه ی تعداد دایره ها دستور زیر را وارد کنید: 

length(centers)

 خواهید دید که تعداد دایره ها برابر است با 127 .