بر روی لینک های زیر کلیک نمایید
- دانلود رایگان کد های آماده MATLAB
- دانلود رایگان فیلم های آموزشی الگوریتم های بهینه سازی ، شبکه عصبی ، منطق فازی و ...
- انجام پروژه های برنامه نویسی MATLAB
- تدریس خصوصی ، دوره های آموزشی الگوریتم های بهینه سازی ، شبکه عصبی ، منطق فازی و ...
- دانلود رایگان فایل های آموزشی
يک فايل جديد باز ميکنيم که عکسي از دانههاي برنج است. ميخواهيم دانههاي برنج را درون عکس بشماريم. اين عکس از قسمت برنج مرغوبِ خط توليد يک کارخانه است. شمارش دانههاي برنج به کارخانه برنج سازي کمک ميکند بداند چند درصد برنجهايش درجه يک هستند. اين دستورات را اجرا کنيد:
p=imread('rice.tif');
re=edge(p,'sobel');
imshow(re)
re2=edge(p,'canny');
figure, imshow(re2)
البته اول تصوير اصلي برنجها را ببينيد و سپس مقايسه کنيد. دو روش Sobel و Canny براي پيدا کردن لبهها مورد آزمايش قرار گرفته است. مشخص است که روش Canny اينجا بهتر جواب داده است. دو کار به عهده شماست.
- الگوريتمي پيدا کنيد که تعداد برنجهاي درون عکس را بشمارد.(راهنمايي: اگر بتوانيد تعداد مسيرهاي بستهی درون تصوير لبهها را بشماريد تقريباً همه برنجها را شمردهايد)
- کشف کنيد که روش Canny براي مشخص کردن لبه چه روشي است و چطور عمل ميکند و چرا از روش سادة Sobel بهتر است.
براي بهتر شده نتيجه کار با روش Sobel بهتر است از عملگرهاي ريختشناسي (morphological) استفاده کنيم. سعي ميکنيم قسمتهاي نزديک به هم لبة هر برنج را به هم متصل کنيم. با اين کار لبة برنجها را کامل ميکنيم و خوردگيها را از بين ميبريم. اما قبل از ادامه کار دستور close all را امتحان کنيد. اين دستور همه figure هايي که باز هستند را ميبندد تا زياد شلوغ نشود! حالا اين دستورها را اجرا کنيد:
figure, imshow(re)
re4=bwmorph(re,'close');
re5=bwmorph(re4,'bridge');
figure, imshow(re5) , title(‘after morphological operations’)
آخرين تصوير لبهها را با تصوير اوليه لبهها که همان re است مقايسه کنيد. ميبينيد که در متصل کردن قطعات پيشرفت خوبي داشتيم. اولين دستور bwmorph عمل Closing را روي تصوير انجام ميدهد و دومين دستور عمل Bridge. براي اينکه بدانيد هرکدام از اين دستورات چکار ميکنند از help bwmorph استفاده کنيد.
براي اينکه بهتر کار با اين دستورها را ياد بگيريم سري به Demoهاي Matlab ميزنيم. در صفحه Matlab بنويسيد: demo و با اجرا کردن اين دستور ليست demoهاي مختلف ظاهر ميشود. Image Processing Toolbox را انتخاب کنيد. و در ليست کناري Edge Detection را انتخاب کنيد. بقيه ماجرا با خودتان! دستورهاي معرفي شده:edge, bwmorph, demo
هيستوگرام تصوير
تا به حال تصويرهاي Gray Scale را بررسي کرديم. از اين به بعد هم همين کار را ميکنيم! با اين تفاوت که اگر تصوير ورودي رنگي بود اول Gray Scaleاش ميکنيم و بعد کارها را ادامه مي دهيم.
تصوير flowers.tif را با دستور imread در ماتريس flowers ذخيره کنيد. از دستور rgb2gray براي تبديل فرمت رنگي تصوير به Gray Scale استفاده کنيد. حالا هيستوگرام تصوير را رسم کنيد. بعد يکي از قلههاي نمودار هيستوگرام را انتخاب کنيدکه بين دوتا دره باشد. کاري کنيد که فقط اين قله درون هيستوگرام باقي بماند. بعد با دستور im2bw تصوير را از Gray Scale به سياه سفيد تبديل کنيد و نتايج را مقايسه کنيد!
چطور شد؟ توضيح ميدهم، اينطوري:
flowers=imread('flowers.tif','tif');
flowersgray=rgb2gray(flowers);
imhist(flowersgray)
من هيستوگرام را نگاه کردم و شما هم نگاه کنيد. (هيستوگرام تصوير را بادستور imhist کشيدم) قلة بين 50 و 100 را انتخاب ميکنم. حالا يک ماتريس جديد ميسازم طوري که فقط جاهايي که مقدار ماتريس flowersgray در محدودة 50 تا 100 است، در ماتريس جديد 0 باشد و باقي جاها 1 باشد.
(يعني يک ماتريس باينري يا سياه سفيد)
f=ones(size(flowersgray));
f(find(flowersgray>50&flowersgray<100))=0;
imshow(f)
دستورهاي بالا به اين معني است: ماتريس f را هماندازه ماتريس flowersgray بساز. همة درايههايش را يک بگذار. بعد دستور find درون ماتريس flowersgray جستجو ميکند و شماره درايههايي از ماتريس flowersgray را به من ميدهد که در شرط روبهرو برايش مشخص شده. (همان محدودة 50 تا 100). اين درايههاي بخصوص را در ماتريس f از 1 به 0 تبديل ميشود. نتيجه را باهم ببينيم!
اگر دقت کنيم ميبينيم که مجموعة گلدون از پس زمينه جدا شد. آنهم تنها با انتخاب يک قله درون هيستوگرام... حالا من از کجا فهميدم که اين قله مهم است؟... لابد علم غيب داشتم؟... بعدا راجع به انتخاب قلهها بيشتر خواهيم فهميد.
حالا دستور im2bw را - که تصوير را سياه سفيد ميکند - امتحان کنيد.
bwflowers=im2bw(flowersgray,gray);
imshow(bwflowers)
دستور im2bw حدي تعيين ميکند و درايههايي که از آن حد کمتر باشند را صفر و آنهايي که بيشتر هستند را يک ميکند. آيا متوجه تفاوت دو روش شدهايد؟ اگر به جاي گلدون در تصوير مورد نظر، عکس پرسنلي افراد بود چه اشکالي در روش im2bw وجود داشت؟
دستورات معرفي شده: rgb2gray, imhist, ones, find
اگر ما روبات بوديم...
خب فرض کنيد برنامهاي براي يک روبات مينويسيد که با استفاده از يک دوربين به يک بازوي دقيق فرمان ميدهد که سکههاي «اسکروچ» را بردارد و روي هم قرار دهد. براي اينکار لازم است محل دقيق سکهها را تشخيص دهيم تا فرمان مناسب براي بازو صادر شود. برنامة زير اين کار را انجام ميدهد. دقت کنيد ببينيد که چطور اينکار را انجام ميدهد:
coins = imread('eight.tif');
BW=~im2bw(coins,.75);
imshow(BW)
L = bwlabel(BW);
stats = imfeature(L,'Centroid');
stats(7)
خروجي همان متغيير stats است. اين متغيير 7 عنصر دارد. درحالي که 4 سکه بيشتر درون تصوير وجود ندارد! اشکال از کجاست؟.... راه حلي هم براي اين به ذهنتان ميرسد؟
دستورهاي معرفي شده: bwlabel, imfeature
با اينترنت ياد بگيريم:
به آدرس www.ph.tn.tudelft.nl/hpise/index.html مراجعه کنيد و در کلاس آنلاينِ مجانياش ثبتنام کنيد. من آنجا به اسم raminia عضو هستم. خيلي جالب است! حتما امتحانش کنيد.
مابقی مطالب در ادامه مطلب