بسمه تعالی
موضوع تحقیق:
نرم افزار متلب
محقق:
سعید کوشکی
شماره دانشجویی: 917805725
مقطع: کارشناسی ناپیوسته آموزش ریاضی
واحد عملی:
آزمایشگاه ریاضی
استاد:
آقای کرمیان
دانشگاه پیام نور کوهدشت
فهرست مطالب
مقدمه……………………………………………………………………………………………………………..2
فصل اول
بخش اول – ملزومات و پیش نیازهای آموزش MATLAB…………………………………….3
بخش دوم – آموزش بسیار مقدماتی MATLAB………………………………………………..5
بخش سوم : اجرای نرم افزار MATLAB ……………………………………………………………5
بخش چهارم : اجرای دموها ………………………………………………………………………………..7
بخش پنجم : استفاده از help …………………………………………………………………………..10
بخش ششم: ساخت متغیر …………………………………………………………………………………14
فصل دوم
ماتریس ها …………………………………………………………………………………………………….16
عملیات ریاضی ماتریس ها………………………………………………………………………………. 23
انجام عملیات روی ماتریس ها……………………………………………………………………………25
فصل سوم
ترسیم داده ها نمودارهای 2 بعدی………………………………………………………………………28
نمودارهای 3 بعدی…………………………………………………………………………………………..28
نمودارهای5/2 بعدی ………………………………………………………………………………………..32
تابع ……………………………………………………………………………………………………………….34
خطایابی برنامه ها …………………………………………………………………………………………….37
فصل چهارم
آشنایی با Matlab و Image Processing Toolbox………………………………………49
ربات مسیریاب توسط پردازش تصویر…………………………………………………………………54
افزایش کنتراست تصویر…………………………………………………………………………………..55
مراجع ……………………………………………………………………………………………………………60
مقدمه
Matlab نرم افزاری است که براساس مجموعه ای اصول عملیاتی که بر ماتریس ها عمل می کند بنا نهاده شده است.Matlab بر گرفته از "آزمایشگاه ماتریس" است .زبانی بسیار قدرتمند جهت پردازش داده ها است که امروزه بسیاریاز رشته های مهندسی را کنترل کرده و کار مهندسان را تا نوشتن چند برنامه ساده آسان نموده است.محاسباتی که تصور حل کردن آنها با استفاده از روشهای سنتی لرزه بر اندام هر مهندسی می اندازدتوسط Matlab کاملا انعطاف پذیر ، و آسان حل می شوند.
از دیگر خصوصیات Matlab اینست که می تواند تابع ها و روتین های نوشته شده در زبانهای دیگر مثل C++ و Java را قبول و به کمک آنها مسائل را حل کند.این خصوصیت قدرت پردازش و طرفداران آن را نیز چند برابر کرده است.
امروزه شرکت ها و گروههای نرم افزاری زیادی سعی دارند تا برنامه های اضافی را برای رشته های بخصوصی مانندمهندسی کنترل ، مهندسی قدرت ،… به محیط مطلب اضافه کنند این برنامه ها اصطلاحا Toolbox یا جعبه ابزار نامیده می شوند .
در این سری مقالات سعی می کنیم تا به صورت خودآموز مطالب راارائه دهیم و بیشتر مطالبی را ارائه دهیم که برای یک دانشجوی مهندسی برق دارای کاربرد باشد.و بتواند به فهم مساله علاوه بر حل آن بیفزاید در این صورت است که لذت حل مساله دو چندان می شود.
فصل اول
مقدمه ای بر مطلب MATLAB
مطلب نام یکی از نرم افزارهای رایانه ای برای انجام محاسبات ریاضی است. واژه مطلب هم به معنی محیط محاسبات رقمی و هم به معنی خود زبان برنامه نویسی مربوطه است از ترکیب دو واژهٔ MATrix و LABratuary ایجاد شده است. این نام حاکی از رویکرد ماتریس محور برنامه است، که در آن حتی اعداد عادی هم به عنوان ماتریس در نظر گرفته می شوند.
با نرم افزار مطلب می توان ماتریس ها را به راحتی تغییر داد، توابع یا داده ها را ترسیم کرد، الگوریتم ها را اجرا کرد و همچنین صفحات رابط میان کاربر و رایانه ایجاد کرد.
مطلب که از محصولات شرکت مث ورکس (The MathWorks) است، برای گروه های مختلف مهندسان رشته های مختلف از جمله مهندسی برق، مکانیک، کامپیوتر و … کاربرد بسیاری دارد.
قدرت مطلب
برنامه های مطلب همگی متن باز هستند و در واقع مطلب مفسر است نه کامپایلر. قدرت مطلب از انعطاف پذیری آن و راحت بودن کار با آن ناشی می شود، همچنین شرکت سازنده و گروه های مختلف، از جمله دانشگاه های سرتاسر جهان و برخی شرکتهای مهندسی هر ساله جعبه ابزارهای خاص-کاربردی به آن می افزایند که باعث افزایش کارای و محبوبیت آن شده است. فهرستی از این جعبه ابزارها در زیر آمده است:
* جعبه ابزار مخابرات مطلب
* جعبه ابزار کنترل مطلب
* جعبه ابزار فازی مطلب
* جعبه ابزار محاسبات مطلب
* جعبه ابزار سیمولینک مطلب
* جعبه ابزار تخمین مطلب
* جعبه ابزار آمار مطلب
* جعبه ابزار جمع آوری دادهٔ مطلب
* جعبه ابزار شبکه عصبی مطلب
* جعبه ابزار پردازش تصویر مطلب
* جعبه ابزار پردازش صوت مطلب
* جعبه ابزار احتمالات مطلب
* جعبه ابزار کارگاه بلادرنگ مطلب
MATLAB محیطی برای محاسبات عددی و زبان برنامه سازی می باشد که توسط MATH WORKS ساخته شده است ، MATLAB امکان دستکاری و کارکردن ساده با ماتریس ، رسم نمودار توابع و دیتا ، اجرای الگوریتم ، ساخت واسط کاربر و واسط برنامه با سایر زبانهای برنامه نویسی را بوجود می آورد . اگر چه MATLAB مخصوص محاسبات عددی است اما toolbox ی با استفاده از موتور maple آنرا به سیستم کامپیوتری – جبری تبدیل می کند . این نرم افزار توسط یک میلیون نفر در دانشگاهها و صنعت مورد استفاده قرار می گیرد . هزینه این نرم افزار برای مصارف تجاری بدون tool box حدود 2000 دلار آمریکا و برای مصارف دانشگاهی با toolbox محدود حدود 100 دلار آمریکا است .
بخش اول – ملزومات و پیش نیازهای آموزش MATLAB
محیط مطلب:
محیط نرم افزار Matlab متشکل از هفت پنجره می باشد.پنجره ها مانند: پنجره راهنما یا کمک ، پنجره فرمان ،پنجره تاریخچه ، دایرکتوری جاری ، محیط کار ،profiler، launch Pad
ما بیشتر کارمان با پنجره فرمان است .Matlab با استفاده از یک علامت << آمادگی خود را جهت ورود فرمان و اجرای آنها اعلام میکند .هر دستوری که می خواهید به Matlab بدهید در جلوی این علامت تایپ می کنید و سپس کلید Enter را جهت دریافت جواب فشار می دهید.
در انتهای دستورات Matlab ، هم می توانیم از سمی کالن" ; " استفاده کنیم و هم میتوانیم دستور را بدون سمی کالن تایپ کنیم .در صورتی که دستور را بدون سمی کالن بنویسیم Matlab دستور را اجرا کرده و جواب را بلافاصله نمایش می دهد اما چنانچه از سمی کالن استفاده کنیم Matlab دستور را اجرا کرده ، منتها نتیجه را در حافظه نگه می دارد و آنرا نمایش نمی دهد.
این پایان نامه طور مرحله به مرحله با جنبه های مختلف MATLAB آشنا می کند . پس از کامل نمودن این پتیتن نامه شما به سادگی با استفاده از HELP MATLAB می توانید ویژگی های پیشرفته MATLAB را یاد بگیرد . و همچنین در استفاده از ویژگی های پیشرفته MATLAB راحت خواهید بود و قادر خواهید بود نکات بسیار کاربردی و پیشرفته تری که به رشته تحصیلی یا کارتان مربوط می شود را به خودتان آموزش بدهید .
شما باید دارای مهارت های ا ولیه استفاده از کامپیوتر باشید بعنوان مثال شما باید قادر باشید که برنامه ای را اجرا کنید ، آنرا ببندید و فایلهایتان را ذخیره کنید ، نوشته را کات کنید و در جای مورد نظر پیست کنید و …
شما باید بدانید که از یک نرم افزار واژه پرداز چگونه استفاده کنید ، مانند نوت پد در ویندوز که شما می توانید از آن برای نوشتن برنامه های MATLAB استفاده کنید .همچنین MATLAB نرم افزار واژه پرداز مخصوص خود را دارد که شما می توانید از آن استفاده کنید ( که در این آموزش به شما نشان خواهیم داد )
شما باید دانش اولیه ای در مورد جبر و مثلثات داشته باشید مانند آنچه که در دبیرستان پوشش داده شده همچنین اطلاعاتی در مورد جبر خطی ( مانند ماتریس ها ، بردارها و معکوس آنها و … ) دانستن این موارد موقع شروع آموزش MATLAB بسیار سودمند است اما اصول جبر خطی مورد نیاز در این آموزش شرح داده خواهد شد
ما در این آموزش با یکدیگر تعامل خواهیم داشت و آموزش همراه کار و تمرین خواهد بود . در حالیکه شما صفحه تمرین را مطالعه می کنید باید نرم افزار MATLAB را در پنجره جداگانه ای اجرا کنید و تمرینات را حل کنید .
حالا شما آماده اید که آموزش MATLAB را شروع کنید .
امیدوارم اوقات خوشی با MATLAB داشته باشید . حین آموزش خواهش می کنم تا جایی که امکان دارد تمرین حل کنید چون بهترین راه یادگیری MATLAB استفاده از آن است .
بخش دوم – آموزش بسیار مقدماتی MATLAB
MATLAB برنامه ای است که هنگام مواجه شدن با مسائل ریاضیاتی بسیار سودمند خواهد بود مخصوصا در زمینه تکنیک و مهندسی .
شما می توانید از ویژگی built-in MATLAB برای حل بسیاری از مسائل بدون انجام زحمت خاصی ، بهره ببرید از معادلات دو معادله دو مجهول ساده مانند
X + 2Y = 24
12X – 5Y = 10
گرفته تا معادلات بسیار پیچیده مانند فاکتور گیری چند منظوره ، تطابقت منحنی با اطلاعات داده شده ، انجام محاسبات با استفاده از ماتریس ، انجام مسائل مربوط به پردازش سیگنال مانند تبدیلات فوریه ، و ساخت و گسترش شبکه های عصبی .
یک جنبه بسیار قدرتمند و سودمند MATLAB این است که برای رسم بسیاری از انواع منحنی ها مفید واقع می شود و شما را قادر می کند تا توابع پیچیده ماتریسی را رسم کنید و در کل یک آزمایشگاه دیتا است . بعنوان مثال سه شکل زیر با استفاده از توابع چاپ ( plotting ) ساخته شده اند .
آموزش MATLAB دقیقا شبیه آموزش رانندگی است . شما می توانید کلیه قوانین را یاد بگیرید ولی برای اینکه راننده خوبی باشید باید سوار اتومبیل شوید و برای رانندگی به خیابان بروید .
اگر شما قبلا پیش زمینه قویتری از ریاضات و برنامه سازی کامپیوتری داشته باشید شما سریعا یاد می گیرید که از MATLAB چگونه برای اهداف طراحی و یا زمینه کاری خودتان استفاده کنید .
بخش سوم : اجرای نرم افزار MATLAB
شما به سادگی می توانید با دابل کلیک روی ایکون MATLAB این نرم افزار را اجرا کنید یا اینکه با استفاده از منوی start ویندوز این نرم افزار را فراخوانی کنید . پنجره اصلی MATLAB ، دسکتاپ MATLAB نامیده می شود ، که شبیه پنجره زیر است .
http://www.mathworks.com/academia/images/tutorials/matlabstart_wl.gif
شما هنگام اجرای برنامه متوجه خواهید شد که در خط فرمان متن زیر نوشته شده است :
To get started, select "MATLAB Help" from the Help menu.
علامت>> command prompt ( گوش به فرمان ) نامیده می شود ،که مانند یک چشمک زن است و منتظر فرمان شماست . بعد از اینکه شما متنی را در خط فرمان تایپ کردید MATLAB فرمان شما را اجرا می کند و نتیجه را نشان می دهد و منتظر فرمان بعدی شما می ماند بدین ترتیب شما می توانید دستوراتی را که می خواهید وارد کنید . ( MATLAB فرمان را خط به خط اجرا می کند )
درس بعدی در مورد دستورات خاص MATLAB است ، اما الان برای اینکه فقط MATLAB را شروع کرده باشید دستور ساده زیر را وارد کنید . دستور dateرا تایپ کنید و اینتر را بزندی . MATLAB نتیجه را چیزی شبیه متن زیر نمایش می دهد .
>>date
ans =
11-Jun-2008
بدین ترتیب شما بطور موفقیت آمیز اولین دستور ATLAB را اجرا کرده اید .
دستور ساده دیگری که شما الان می توانید امتحان کنید دستور clc است (clear command window ) اگر شما در صفحه فرمان MATLAB بخواهید همه نوشته ها و دستورات را پاک کنید و چشمک زن به ابتدای صفحه برود می توانید در خط فرمان clc را تایپ کنید و اینتر بزنید . همین حالا به صفحه MATLAB بروید و این دو دستور را اجرا کنید . ساده بود . نه ؟
برای خارج شدن از MATLAB می توانید وارد منوی فایل شوید و گزینه exit matlab را انتخاب کنید یا در خط فرمان دستور quit را تایپ کنید و اینتر بزنید .و یا اینکه به سادگی پنجره را ببندید.
بخش چهارم : اجرای دموها
شما قبلاً MATLAB را اجرا کرده اید و دسکتاپ MATLAB را روی دستکتاپ ویندوز باز کرده اید . اگر این کار را انجام نداده اید به بخش قبل مراجعه کنید .
حالا کمی روی Demo ها بحث می کنیم . در واقع Demo زیادی در MATLAB وجود دارد و همه آنها با تایپ کردن دستور Demo در خط فرمان نشان داده می شوند .
ما واقعا انتظار نداریم شما جزئیات MATLAB را با استفاده از این Demo یاد بگیرد اما با استفاده از این Demo ها نسبت به کاراهایی که می توانید با استفاده از MATLAB انجام دهید دید بهتری خواهید یافت . حتی در این Demo چند بازی هم وجود دارد و بعضی از آنها هم کاملا گرافیکی هستند و شما می توانید با استفاده ازاین Demo ها از MATLAB لذت ببرید . MATLAB ابزاری قدرتمند برای حل بسیاری از مسائل است و شما باید این قدرت را بعد از آشنایی با دموها درک کنید .
خوب برای شروع درخط فرمان Demo را تایپ کنید و اینتر بزنید . با این کار صفحه Demo MATLAB بالا می آید و منتظر می ماند تا شما دموی مورد نظرتان را انتخاب واجرا کنید . پنجره Demo MATLAB مشابه صفحه زیر است
در این مبحث نمی توانیم به کل دموها سر بزنیم ولی شروع کردن یکی از دموها را به شما نشان می دهیم و شما می توانید برای بقیه دموها نیز همین کار را انجام دهید .
برای دیدن لیست دموهای مختلف روی علامت + کنار گزینه Matlab کلیک کنید با اینکار شما می توانید دموهایی در مورد ماتریس ها ، اعداد ، اجسام گرافیکی و … را مشاهده کنید . در لیست هر یک از دموها ، دموهای متعددی در آن مورد وجود دارد .
پنجره سمت راست شما چکیده ای در مورد دموی انتخابی به شما نشان می دهد . بعنوان مثال اگر شما gallery را بعنوان دسته مورد نظر خودتان انتخاب کنید text box سمت راست چیکیده ای از این دسته دموها را به شما نشان می دهد .
شما می توانید دموها ی مختلفی را با توجه به کلاس انتخابی تان ببینید . در کلاس gallery دموهایی به نامهای Knot, Quiver, Klein IIو … وجود دارد اگر شما یکی از این دموها را انتخاب کنید اطلاعاتی با توجه به دمو در سمت راست نمایش داده می شود . و دو گزینه وجود دارد.
1- اجرای دمو
2- دیدن کدهای دمو
بعنوان مثال این کار را انجام دهید . کلاس gallery را در صفحه MATLAB خود انتخاب کنید سپس دموی spherical surface harmonicحال شما باید پنجره زیر را ببینید
این دمو به شما یک مثال گرافیکی خوب را نشان مید هد که شما می توانید با استفاده از MATLAB به آن برسید .
حالا کمی وقت صرف کنید و سایر دموها را انتخاب و اجرا کنید تا محدوده توانایی و امکانات MATLAB را بدرستی درک کنید .
قبل از شروع شاید بخواهید دستور intro demo را امتحان کنید . این مثال دیگری است که مقدمه ابتدایی از توانایی های MATLAB را به شما نشان می دهد . برای اجرای intro کلاس Matlab از دموها را انتخاب کنید و سپس matrices بعد basic matrix operation یا اینکه دستور play show intro را تایپ کنید پنچره دیگری بالا می آید و شما می توانید با استفاده از دکمه هایی که در این پنجره وجود دارد جزئیات این دمو را مشاهده کنید .
بخش پنجم : استفاده از help
مطلب دارای سیستم help گسترده ای است ، که شامل جزئیات و اطلاعات help در مورد کلیه دستورها و توابع مطلب می شود . این سیستم help برای افرادی که مبتدی هستند بسیار مناسب خواهد بود ، اما حتی بعد از اینکه شما به یک متخصص مطلب بدل شدید ، از این سیستم برای یادگیری سایر توابع مطلب که تا به حال از آنها استفاده نکرده اید استفاده خواهید کرد . این درس به شما می آموزد که چگونه از این سیستم استفاده کنید
دسترسی به help از طریق خط فرمان :
سه تابع اصلی وجود دارد که شما می توانید از آنها برای کسب اطلاعات در مورد توابع دیگر استفاده کنید : help ، helpwin ( اختصاری help window ) و doc ( اختصاری documentation ) . تابع help و helpwin اطلاعات مشابهی به شما می دهند ، اما با پنجره های متفاوت ، دستور doc یک صفحه html با یک سری اطلاعات بیشتر را نمایش می دهد .
قسمت پایین نمایش help در مورد تابع date را به شما نشان می دهد که این نمایش با استفاده از دستوارات متفاوت انجام شده .
help date
DATE Current date as date string. S = DATE returns a string containing the date in dd-mmm-yyyy format.
See also NOW, CLOCK, DATENUM
توجه : خروجی help معمولاً توابعی که به موضوع مربوط هستند را نیز نشان می دهد . در این مثال ، help علاوه بر موضوع اصلی به شما می گوید : See also NOW, CLOCK, DATENUM. حالا شما می توانید در مورد همین توابع نیز از help استفاه کنید
helpwin date
http://www.mathworks.com/academia/images/tutorials/gettinghelp1_wl.gif
توجه : محتوای اطلاعات دستور help و helpwin یکسان است ولی بهتر است از helpwin استفاده کنید چون :
1- متن در صفحه های مجزا نشان داده می شود
2- شما در قسمت see also می توانید روی تابع یا توابعی که در همین قسمت لیست شده کلیک کنید تا اطلاعاتی در مورد آنها کسب کنید تا اینکه مجبور باشید آنرا در خط فرمان تایپ کنید تا اطلاعاتی در مورد آن بدست آورید .
3- لینک موضوعات پیش فرض ، کلیه دسته بندی ها را لیست می کند و شما می توانید تابع مربوطه با دسته بندی مربوطه را ببینید . بعنوان مثال ، اگر شما بخواهید بدانید خروجی دستور پلات x بر حسب y چیست می توانید روی لینک matlabgraph2d topic کلیک کنید .
doc date
توجه : خروجی دستور doc بسیار کامل است و فقط یه قسمت از اطلاعات خواسته شده در مورد موضوع مورد نظر نیست بلکه مثال های کاملی ارائه می کند که می توانند مورد مطالعه قرار گیرند یا اجرا شوند .
سعی کنید برای توابع مقابل از دستورات مختلف اجرای help استفاده کنید : magic, fft, and surf
استفاده از جستجوگر help مطلب
منبع دیگر help در مطلب ، جستجوگر help مطلب است . شما می توانید جستجوگر help مطلب را با تایپ دستور helpbrowser در خط فرمان مطلب فراخوانی کنید ، روی دکمه ؟ کلیک کنید یا با انتخاب Start->MATLAB-> از desktopاین جستجوگر را فرخوانی کنید .
جستجوگر help دو قسمت عمده دارد ، help navigator و صفحه نمایش . صفحه نمایش ، همانگونه که از نامش پیداست ، اطلاعاتی در مورد موضوع انتخاب شده را نشان می دهد . help navigator در قسمت سمت چپ جستجوگر قرارگرفته ، و برای هدایت کردن از طریق اطلاعات online در مورد موضوع انتخاب شده کاربرد دارد . این قسمت در برگیرنده موارد زیر است :
* فیلتر فراورده
* نوار محتویات
* نوار شاخص
* نوار دمو
* نوار جستجو
* نوار favorit
این بخش منبع گسترده ای برای شما خواهد بود اگر بدنبال یادگیری نکات بیشتری در مورد موضوع داده شده باشید . نوار سرچ در مورد موضوع مورد نظر از میان کلیه اطلاعات موجود جستجو می کند ، و لغات کلیدی که آنها را سرچ کرده اید را بصورت highlight مشخص می کند تا خواندن اطلاعات مورد نظر راحتتر باشد .
حالا با استفاده از امکانات سرج در مورد help از جستجوگر خودش استفاده کنید
بخش ششم: ساخت متغیر
یکی از جنبه های اصلی مطلب متغیر ها هستند ، و شما همواره از آنها استفاده می کنید . در اصل ، یک متغیر مکانی است برای یک مقدار که شما می توانید نامی را به آن نسبت دهید . منظور ما این است که ، هنگامی که چیزی را بعداً محاسبه خواهید کرد ، شما می توانید ازاین مقدار استفاده کنید که متغیری است که بعنوان قسمتی از محاسبات جدید بکار رفته . بیاید تا برای واضح تر شدن مطلب از چند مثال استفاده کنید .
در ساده ترین حالت ، مطلب می تواند بعنوان یک ماشین حساب جیبی باشد . بعنوان مثال دراینجا شما چند محاسبه ساده با استفاده از مطلب مانند یک ماشین حساب انجام می دهید .
4 + 10
ans = 14
5 *10 + 6
ans = 56
(6 + 6) / 3
ans = 4
9^2
ans = 81
شما می توانید ببینید که مطلب کلیه اپراتورهای اصلی ریاضیاتی را شامل + ، – ، * ، / ، ^ و … را ساپرت می کند . و شما می توانید عملگر های را با قرار دادن آنها در داخل پرانتز بصورت دسته و گروه در آورید . با این وجود عبارت ans دقیقا چیست ؟ ans اختصاری answer یا همان پاسخ است ، و در مطلب این عبارت بعوان نام پیش فرض متغیر ها در نظر گرفته شده . و شما می توانید به متغیری که فعلا اسمی برای ان انتخاب نشده فقط با تایپ عبارت ans دست پیدا کنید .
4 + >>5
ans = 9
>>ans
ans = 9
با این وجود اگر معادله جدیدی وارد شود ، مقدار ans تغییر خواهد کرد .
>>ans + 10
ans = 19
حالا شما هم متغیر های خودتان را بعنوان تمرین وارد کنید .
متغیر ans به خودی خود سودمند نیست ، اما قدرت حقیقی ان در این است که شما می توانید متغیر خودتان را تعریف و استفاده کنید . بعنوان مثال :
>>a = 10
a = 10
>>b = 20
b = 20
>>c = 30
c = 30
>>a
a = 10
>>the_average = (a + b + c) / 3
the_average = 20
حالا بیایید بگوئیم که شما متغیر های زیادی را تعریف کرده اید . احتمالاً نام کلیه متغیر هایی را که تعریف کرده اید بخاطر نخواهید آورد ، پس داشتن لیستی از کلیه متغیر هایی که تعریف شده اند سودمند خواهند بود . این دقیقا چیزی است که دستور whos انجام می دهد . حالا با تایپ کردن دستور whos در خط فرمان و زدن اینتر شما می توانید نام و مقدار کلیه متغیر هایی را که تا کنون وارد کرده اید ببینید . بعنوان مثال :
>>a = 5
a = 5
>>b = 6
b = 6
whos
Name
Size
Bytes
Class
a
1×1
8
double array
b
1×1
8
double array
در کل دو عنصر داریم که از شانزده بیت استفاده کردهاند
برای پاک کردن متغیر هایی که قبلا وارد کرده ایدو در حافظه ذخیره شده اند چه کاری باید انجام داد ؟ پاسخ این سوال دقیقا پاسخ به این است که دستور clear چه کاری انجام می دهد . clear را در خط فرمان تایپ کنید ، خواهید دید که کلیه متغیر ها و مقادیری را که قبلا ذخیره شده اند را پاک می کند . مثال فوق را ادامه می دهیم .
whos
Name Size Bytes Class
a 1×1 8 double array
b 1×1 8 double array
Grand total is 2 elements using 16 bytes
clear
whos
جلوگیری از نمایش نتایج بااستفاده از "؛"
اگر بعد از دستور سمیکولون تایپ شود باعث می شود که نتیجه نشان داده نشود . اگر شما عبارتی تایپ کنید ( مثلا b=4+5 ) و در انتهای آن سمیکولون بگذارید ، سپس مطلب عبارت را محاسبه می کند ولی نتایج را در حافظه بصورت داخلی ( بدون نمایش ) ذخیره می کند . بعنوان مثال :
>>a = 10;
>>b = 20;
>>c = 30;
>>d = 40;
>>the_average = (a + b + c + d) / 4
the_average =
25
the_average;
>>b
b =
20
>>e = 50
e =
50
the_blank_average = (a + b + c + d + e) / 5;
>>the_blank_average
the_blank_average =
30
ممکن است اینطور به نظر برسد که استفاده از سمیکولون زیاد هم مهم نیست ، اما در حقیقت سمیکولون همیشه دم دست است و همیشه استفاده می شود . نتیجه نهایی عملیاتی که در مطلب انجام داده اید برایتان مهم است ، که با ترکیب بسیاری از داده ها و نتایج موقت و متغیر های میانی محاسبه می شود . و با افزودن سمیکولون به انتهای دستوری که مقدار آن موقت یا نتیجه بصورت نتیجه میانی است باعث می شود که نتیجه آنها نشان داده نشود . بعنوان مثال ، در مثال بالا سمیکولون بعداز متغیر ها a,b,c,d تایپ شده است ولی فقط نتیجه نهایی که میانگین این چهار متغیر است مهم می باشد و می بینیم که سمیکولون بعد از عبارت the_average تایپ نشده است و نتیجه این دستور نشان داده می شود .
فصل دوم
ماتریس ها :
گفتیم که Matlab بر اساس محاسبات ماتریسها بنا نهاده شده است .ماتریس خانه های متوالی حافظه میباشند که به همه ی آنها یک نام تخصیص داده می شود منتها علاوه برنام برای دستیابی به محتویات یک خانه از شماره آن خانه هم استفاده می شود . این تعریف نرم افزاری ماتریس می باشد . ماتریس ها می توانند دارای بعد باشند مثلا ماتریس های یک بعدی که به آنها بردار هم گفته می شود و همچنین ماتریس های 2 بعدی که متشکل از سطر و ستون هستند و دقیقا همانند یک جدول می توان با آنها رفتار کرد .در کامپیوتر می توان ماتریس های با ابعاد بزرگتر از دو را هم تعریف کرد اما چون تصور این ماتریس خیلی مشکل است استفاده ای از آنها نمی شود.
در Matlab می توان ماتریس هارا به چند شیوه تعریف کرد :
1 در این روش از سمت چپ عناصر ماتریس را می نویسیم و عناصر هر سطر را با استفاده از یک فاصله یا یک کاما از هم جدا می کنیم به محض پایان یافتن یک سطر از یک سمی کالن برای نمایش ابتدای سطر بعدی استفاده می کنیم و عناصر سطر بعدی را هم به وسیله فاصله یا کاما از هم جدا می کنیم و …..
2 در این روش می توانیم به جای سمی کالن";" برای مشخص کردن انتهای سطر از کلید Enter استفاده کنیم .
3 در این روش از یک فرمت Matlab استفاده می کنیم . این فرمت به صورت x:y:z است که x عدد ابتدائی و y گام حرکت و z عدد انتهایی می باشد .در این روش Matlab از x شروع کرده و هر بار به اندازه ی y به x اضافه می کند تا وقتی که مقدار آن از z بیشتر شود برای مثال دستور 1:2:9 اعداد 1 3 5 7 9 برای ما نشان می دهد.
Code:
>> a=[1:2:9]
a =
1 3 5 7 9
توجه : در روشهای بالا ابتدا و انتهای ماتریس با استفاده از [] مشخص خواهد شد .
Matlab جواب هر دستور محاسباتی را نیز در یک ماتریس بر می گرداند.زیرا عملوند ها در یک عبارت محاسبه ای همگی ماتریس هستند طبیعتا جواب مساله هم باید یک ماتریس باشد. توجه داشته باشید که یک عدد تنها هم یک ماتریس 1*1 است.
حال می خواهیم با توابع مربوط با ماتریسها هم تا اندازه ای آشنا شویم .هدف ما فقط آشنایی است و تسلط کامل فقط به تمرین دانشجو بستگی دارد. هر ماتریس دارای تعدادی سطر وستون است .برای بدست آوردن سطر و ستون یک ماتریس مشخص از دستور size() استفاده می کنیم.
شکل دستور بدین صورت است :
Code:
[m,n]=size(a)
در این دستور با فرض اینکه ماتریس a دارای 2 سطر و 3 ستون باشد تعداد سطر ها و ستون های ماتریس های a در ماتریس سطری دو عضوی قرار می گیرد.تعداد سطر ها در m و تعداد ستون ها در n قرار می گیرد .
می توانیم از شکل دیگر دستور هم استفاده کنیم این فرمتبرای دستورات دیگر هم قابل استفاده است .
Code:
B=size(a)
در اینجا ما به جای مشخص کردن ماتریس با استفاده از [m,n] نام b را قرار داده ایم در اینجا Matlab ماتریسی با نام b می سازد و سپس جواب را در آن ذخیره می کند.
Code:
>> a=[1 2 3;4 5 6]
a =
1 2 3
4 5 6
>> b=size(a)
b =
2 3
ماتریس قطری
فرض کنید ماتریس a بدین صورت تعریف شود:
Code:
a=[1 2 3 ];
اگر a یک ماتریس سطری و دارای n عنصر باشد می توان با استفاده از دستور diag(a) این ماتریس را به یک ماتریس قطری تبدیل کرد که ماتریس حاصل یک ماتریس n*n خواهد بود . در این مثال ماتریس قطری بدست آمده 3*3 خواهد بود.
Code:
>> a=[1 2 3]
a =
1 2 3
>> diag(a)
ans =
1 0 0
0 2 0
0 0 3
ماتریس یکانی:
ماتریس مربعی که کلیه درایه های آن یکباشد را ماتریس یکانی می گویند.شیوه ساخت ماتریس یکانی در Matlab، علاوه بر روش عمومی ساخت ماتریس ها استفاده از دستورeye() می باشد مثلا برای ایجاد ماتریس یکانی 3*3 از دستور زیر استفاده می کنیم.
Code:
>> a=eye(3)
a =
1 0 0
0 1 0
0 0 1
ترا نهاده ی یک ماتریس:
با مفهوم ترانهادهی یک ماتریس در ریاضیات مقدماتی آشنا شده اید. ترانهاده ی ماتریس a ماتریسی است که اعضای آن نسبت به قطر اصلی معکوس شده اند.ترانهاده در Matlab با استقاده از یک کوتیشن تکی نمایش داده می شود.
Code:
>> a=[1 2 3
4 5 6
7 8 9]
a =
1 2 3
4 5 6
7 8 9
>> b=a'
b =
1 4 7
2 5 8
3 6 9
ماتریس یکها :
ماتریسی است که کلیه اعضای آن عدد یک باشد . این ماتریس با ماتریس یکانی متفاوت است ماتریس یکانی ماتریسی مربعی است و ماتریس یکها مربعی نیست و هر اندازه ای می تواند داشته باشد.
با استفاده از دستور ones(m,n) یک ماتریس یکها می توانیم بسازیم .البته این روش علاوه بر روش عمومی ساخت ماتریس ها می باشد.این دستور یک ماتریس که کلیه اعضای آن عدد 1 و اندازه ی آن m*n می باشد می سازد.
به طور مشابه می توان ماتریس صفرها را هم با استفاده ازدستور zeros(m,n) ساخت.
Code:
>> a=ones(3,2)
a =
1 1
1 1
1 1
>> b=zeros(2,3)
b =
0 0 0
0 0 0
عملیات ریاضی ماتریس ها :
جمع و تفریق
در دبیرستان با این نوع عملیات آشنا شدید.درایه های متناظر دقیقا با هم جمع وتفریق می شوند .
ضرب :
عمل ضرب ماتریس ها تعریف دیگری دارد که نمی خواهم دوباره آن را بیان کنم .
قبلا با استفاده از روش های اثبات ثابت می کردیم که
Code:
(A*B)'=B'A'
حال درستی این مطلب را با نرم افزار Matlab امتحان می کنیم .
Code:
>> a=[1 2 3]
a =
1 2 3
>> b=[2
4
6]
b =
2
4
6
>> c=(a*b)
c =
28
>> c'
c =
28
>> b'*a'
ans =
28
در فیزیک و ریاضی با مفهوم ضرب نقطه ای یا ضرب داخلی آشنا شدیم . جواب ضرب داخلی دو ماتریس یک عدد اسکالر است . برای ضرب داخلی در Matlab از dot استفاده می شود .
Code:
<< dot(a,b)
ans =
28
ماتریس ها و دستگاه های معادلات جبری
ماتریس ها یا آرایه ها در Matlabاز اهمیت زیادی برخوردارند زیرا همانطور که گفته شد این نرم افزار در واقع آزمایشگاه ماتریس می باشد و قبل از انجام اکثر محاسبات به صورت خودکار آرایه ای از متغیرها ایجاد شده و محاسباتی بر مبنای روش های عددی بر روی آن ها صورت می گیرد . گذشته از این ، آرایه ها در اکثر زبان های برنامه نویسی مفهومی مشخص و کاربردی دارند که این امکان در Matlab وجود دارد که متغیرهای استفاده شده را ( که خانه هایی از حافظه ی RAM کامپیوتر می باشند ) به صورت گرافیکی در کادر Work Space ملاحظه نمایید .
تعریف ماتریس
آرایه های هر سطر به وسیله فاصله جدا می شوند .
یک سطر با یک سمی کالن تمام می شود .
تمرین
ماتریس های زیر را تعریف کنید :
انجام عملیات روی ماتریس ها
برای محاسبه ی ترانهاده ی ماتریس از دستور َ Aاستفاده می کنیم .
برای محاسبه ی دترمینان ماتریس از دستور ( A ) det استفاده می کنیم .
برای انجام جمع و تفریق روی ماتریس ها از عملگرهای -+ استفاده می کنیم .
برای ضرب ماتریسی دو ماتریس از عملگر *استفاده می کنیم .
برای ضرب آرایه در آرایه ی دو ماتریس از عملگر * استفاده می کنیم .
برای پیدا کردن ماتریس معکوس از تابع () inv استفاده می کنیم .
تمرین
ماتریس های زیر را تعریف کنید :
ترانهاده و معکوس ماتریس C را بدست آورید .( آیا در مورد AوB این کار امکان پذیر است ؟)
حاصل را بدست آورید .( آیا امکان پذیر است ؟)
جبر چند جمله ای ها
در Matlab هر چند جمله ای بصورت یک ماتریس سطری تعریف می شود که آرایه های آن ضرایب چند جمله ای می باشند . به عنوان مثال ماتریس زیر معادل چند جمله ای بصورت زیر تعریف می شود :
به این نکته دقت داشته باشید که تعریف ماتریس به معنای تعریف چند جمله ای نیست بلکه از دستوراتی که بعد از تعریف ماتریس بر روی آن اعمال می کنیم ، Matlab با آن ماتریس همانند یک چند جمله ای رفتار می کند .
برای جمع و تفریق دو چند جمله ای می توانیم از + و -استفاده کنیم . (در صورت یکسان نبودن تعداد جملات باید برای جمله ی غائب ، ضریب صفر در نظر بگیریم .
برای ضرب و تقسیم دو چند جمله ای از دستورات conv و deconv استفاده می کنیم .( نکته ی جالب در مورد این دستور : conv از لغت convolution گرفته شده است و همانطور که می دانید در نظریه ی سیگنال و سیستم این واژه به معنی اپراتوری است که یک سیگنال را روی تمام زمان ها در پاسخ ضربه ی سیستم ضرب کرده و پس از شیفت دادن هر پاسخ به مقدار متناظر ورودی ، کل مقادیر را روی تمام زمان ها جمع کرده یا انتگرال می گیرد و در واقع نماد کئوولوشن که یک علامت " * " می باشد به معنای یک علامت * و یک علامت + می باشد که روی هم قرار گرفته اند . از طرفی می دانید که ضرب دو چند جمله ای نیز به معنای ضرب کردن تک تک جملات در یکدیگر و در نهایت جمع کردن آن هاست که ارتباط ظریفی بین مفهوم کائوولوشن و این قضیه وجود دارد ، کمی روی این مسئله فکر کنید !!)
برای محاسبه ی ریشه های یک چند جمله ای از دستور(A) roots استفاده می کنیم .
برای بدست آوردن یک چند جمله ای از روی ریشه های آن از دستور (A)poly استفاده می کنیم . ( با استفاده از این دستور ، عملی عکس دستور roots انجام می گیرد .)
با استفاده از دستور help polyfun می توان لسیت دستورات چند جمله ای ها را مشاهده نمود .
تمرین
1. حاصل عبارت را بدست آورید . (راهنمایی : دو ماتریس متناظر با چند جمله ای تعریف کنید و با استفاده از دستور آن ها را ضرب کنید )
2. ریشه های معادلات را بدست آورید .
حل دستگاه های معادلات جبری
دستگاه زیر را در نظر بگیرید :
می توان این دستگاه را با ماتریس های زیر مشخص کرد :
جواب دستگاه با استفاده از دستور بدست می آید :
تمرین
1. دستگاه های زیر را حل کنید :
راهنمایی : ماتریس ضرائب دستگاه دوم را به این صورت تعریف کنید :
2. عبارت های حوزه ی زمان جریان های را در مدار زیر بدست آورید . (صفحه ی 272 _ مثال 8 _ 10 )
مشتق ، حد ، انتگرال و حل معادلات دیفرانسیل
محاسبه ی مشتق
فرم کلی دستور بدین صورت است :
syms از واژه ی symbol به معنای نمادین گرفته شده است و در خط اول ، این دستور یک متغیر نمادین تعریف می کند .( و نه متغیر عددی )
تمرین
مشتق توابع زیر را بدست آورید .
(مشتق دوم)
(مشتق اول و سوم )
محاسبه ی حد
تابع مورد نظر
تمرین
حدود زیر را محاسبه کنید .
محاسبه ی انتگرال
برای محاسبه ی انتگرال معین از دستور زیر استفاده می کنیم :
تمرین
انتگرال های زیر را محاسبه کنید .
* کدامیک از توابع بالا متعامد هستند ؟ ( راهنمایی : توابع متعامد توابعی هستند که انتگرال حاصلضرب شان روی یک بازه صفر شود .نکته ی جالب : تبدیل پرکاربرد فوریه که به زبان ساده به معنی استخراج مولفه های سینوسی از یک سیگنال می باشد ، از همین خاصیت کلیدی استفاده می کند .)
برای محاسبه ی مجموع یک دنباله از دستور روبرو استفاده می کنیم :
برای محاسبه ی سری تیلور از دستور روبرو استفاده می کنیم :
یادآوری : سری تیلور بسط هر تابع را حول نقطه یa بدست می دهد :
در دستور بالا اگر a را بکار نبریم سری مک لوران محاسبه می شود .
با اجرای دستور taylortool << یک محیط گرافیکی برای محاسبه ی سری تیلور فراخوانی می شود .
حل معادلات دیفرانسیل
* حل معادله دیفرانسیل با شرایط اولیه ی
حل معادله دیفرانسیل با شرایط اولیه ی
چون مشتق بر حسب x است آن را به عنوان آخرین آرگومان در نظر می گیریم .
دستور Simplify برای ساده کردن عبارت حاصل به کار می رود .
حل معادله دیفرانسیل با شرایط اولیه ی
تبدیل فوریه و تبدیل Z
تبدیل فوریه یکی از تبدیلات مهم در ریاضیات و پردازش سیگنال می باشد و حالت گسسته ی آن تبدیل Z می باشد . با استفاده از دستورات Matlab به راحتی می توان این تبدیلات را انجام داد .
تبدیل فوریه ی یک تابع با استفاده از دستور Fourier محاسبه می شود .
برای محاسبه ی عکس فوریه از ifourier استفاده می کنیم .
تبدیل z یک دنباله که با سری تعریف می شود با دستور ztrans قابل محاسبه است .
تمرین
تبدیل فوریه ی توابع زیر را بیابید :
تبدیل z دنباله ی را بیابید .
فصل سوم
ترسیم داده ها
نمودارهای 2 بعدی
مجموعه دستورات زیر نحوه ترسیم یک تابع بر حسب یک متغیر مستقل را نشان می دهد:
هفت خط فوق به ترتیب اعمال زیر را انجام می دهند :
1ـ بردار متغیرهای مستقل (x ) و تابع ((y را ایجاد می کند.
2ـ مقادیر yرا بر حسب x رسم می نماید.
3ـ شبکه را به نمودار می افزاید.
4ـ توضیح محور افقی را می نویسد .
5ـ توضیح محور عمودی را می نویسد.
6ـ تیتر نمودار را در بالای آن می نویسد.
7ـ در نقطه مورد نظر ( در این مثال نقطه (2/. و1) ) متغیر حرفی مشخص شده ( در این مثال center) را می نویسد.
می توانید نمودار ایجاد شده را به کمک دستور Save As در منوی File پنجره نمودار ، ذخیره نمایید. این دستور نمودار را در یک پرونده که نام آن را خودتان وارد خواهید کرد و دنباله آن ffig . می باشد ذخیره می کند. شما می توانید این نمودار را در دفعات بعدی کار با MATLAB با استفاده از دستور open بازیابی نمایید.
در هنگام رسم نمودارها می توانید از علامتهای مختلف ( بجای خط ) برای رسم توابع استفاده کنید همچنین می توانید بیش از یک تابع را در یک نمودار نمایش دهید .
ودر صورت لزوم نام توابع را نیز در همان نمودار نشان دهید.
می توانید بیش از یک نمودار را در یک پنجره نشان دهید:
دو عدد اول در دستورSubplort تعداد تقسیمات صفحه را معین می کنند ( سطری و ستونی) و عدد سوم مکان رسم نمودار (یا تغییر روی نمودار موجود ) را مشخص می نماید. نمودار را می توانید با استفاده از دستور clf پاک کنید.
با استفاده از دستور figure می توانید پنجره جدیدی برای رسم نمودار باز نمایید . دستور axis حدود بالا وپایین محورهای مختصات را به صورت یک بردار ارائه می نماید.
در تمامی مثالهای بالا مغادیر متغیر مستقل و متغیر وابسته به صورت دو بردار بر حسب هم رسم شدهاند. در صورتی که تابعیت متغیر وابسته بر حسب متغیر مستقل مشخص باشد می توانید از دستور fplot برای رسم آن استفاده کنید:
آرگومان اول این دستور یک بردار حرفی است که مشخص کننده رابطه تابع ( در صورت ساده بودن رابطه تحلیلی تابع ، همانند مثال فوق ) یا نام m-file حاوی تابع (که جداگانه باید ایجاد شده باشد ) است. آرگومان دوم fplot یک بردار دو عضوی است که حد پایین و بالای متغیر مستقل را مشخص می کند.
تعدادی از دستورهای ترسیم دو بعدی در زیر آورده شده اند :
نمودارهای 3 بعدی
دستورهای زیادی در MATLAB برای ترسم نمودارهای سه بعدی وجود دارند. یک منحنی سه بعدی را می توانید به کمک دستور ببینید:
سطوح سه بعدی را می توانید با استفاده از دستور surf ترسیم کنید :
دستور meshgrid شبکه دو بعدی روی صفحه xy را ایجاد می کند. برای بردارهای ورودی به این دستور مشخص کننده تقسیمات در جهات x و y هستند . سطح ایجاد شده می توانید با کمک دستور shading هموار کنید. همچنین برای تطابق رنگها با اعداد محور z می توانید از دستور colorbar استفاده کنید.
برای رسم سطوح سه بعدی از دستورات دیگری مانند mesh ، meshc ، meshz وwaterfall نیز می توانید کمک بگیرید.
نمودارهای5/2 بعدی
نمودارهای به اصطلاح 5/2 بعدی برای دیدن سطوح 3 بعدی روی صفحه مختصات 2بعدی بکار می روند. یکی از این روشها رسم خطوط همتراز یک سطح است .
آرگومان چهارم در دستور contour برداری است که بر اساس آن منحنیهای همترازی که مقادیر عددی آنها برابر با مولفه های آن بردار است روی نمودار نشان داده خواهند شد. دستور clabel مقادیر خطوط همتراز را روی نمودار نشان می دهد.
روش دیگر آن است که سطح را از زاویه ای عمود بر صفحه xy نگریست و رنگهای متفاوتی به مقادیر مختلف z نسبت داد:
برنامه نویسی (m- files )
مجموعه ای از دستورات MATLAB را می توانید در یک پرونده ذخیره کنید و سپس آنها را یکجا اجرا نمائید. چنین پرونده ای برای آنکه در محیط MATLAB قابل اجرا باشد باید حتماً دارای دنباله "m" باشد. در صورتی که از ویرایشگرMATLAB Editor) MATLAB) استفاده کنید. دنباله "m" بطور خود کار در هنگام ذخیره پرونده به نام آن افزوده می گردد. در صورت استفاده از ویرایشگر دیگری بغیر از ویرایشگر MATLAB (نظیر Notepad) اطمینان حاصل کنید که پرونده حتماً به روش ascii وبا دنباله "m" ذخیره گردد.
در این بخش از یادداشت فقط بر نحوه برنامه نویسی و اجرای برنامه ها تاکید شده است و نتایج اجرای برنامه های مورد بحث نشان داده نشده اند. به خواننده توصیه می گردد که خود برنامه ها را اجرا کرده ونتایج آنها را مشاهده نماید.
برنامه اصلی
m -file ها می توانند به دو شکل برنامه اصلی و تابع باشند . برنامه اصلی عبارتست از مجموعه ای از دستورها که می توان آنها را بطور جداگانه در محیط کار MATLAB اجرانمود. هنگامی که نام برنامه اصلی را در محیط کار MATLAB بنویسید این دستورها به ترتیب اجرا می گردند. به عنوان مثال برای محاسبه حجم گاز کامل ، در دماهای مختلف و فشار معلوم ، دستورات زیر را در ویرایشگر MATLAB بنویسید وسپس تحت عنوان pvt.m ذخیره کنید:
علامت % نشانگر وجود توضیحات در برنامه است . علامت % وآنچه بدنبال آن در همان سطر می آید به هنگام اجرای برنامه نادیده گرفته می شود . همچنین علامت … بیانگر آن است که دستور مورد نظر در این سطر تمام نشده ودر سطر بعدی ادامه می یابد. مورد استفاده این علامت بیشتر در مورد دستورهای محاسباتی طولانی است که برای مطالعه راحت تر این قسمت از برنامه بهتر است در دو یا سه خط نوشته شود.
پس از ایجاد پرونده pvt.m ، برای اجرای آن کافی است که نام آن را در محیط کار MATLAB بنویسید و نتایج را مشاهده کنید (نمودار در زیر نشان داده نشده است).
استفاده از diary برای ایجاد برنامه
یک روش ایجاد برنامه برای مبتدیان بکار بردن دستور diary است. در صورت استفاده از دستور زیر
تمامی نوشته های محیط کار MATLAB پس از آن در پرونده xyz حک می گردند. پرونده xyz بدون دنباله خواهد بود مگر آنکه خودتان برای آن دنباله مشخص کنید. در این حالت می توانید شروع به نوشتن دستورات مورد نظر در محیط کار MATLAB کنید. نتایج را همان جا ببینید و در صورت لزوم تصحیحات لازم را انجام دهید. هنگامی که به پایان محاسبات ونتیجه دلخواه رسیدید، پرونده xyz را به کمک دستور زیر ببندید :
اکنون می توانید پرونده xyz را باز کرده ، خطوط و دستورهای اضافی را از آن پاک کنید و سپس با دنباله m آن را ذخیره نمائید. به این ترتیب یک m -file ایجاد کرده اید که به نتایج اجرای آن اطمینان دارید .
تابع
علاوه بر توابعی که همراه MATLAB هستند ، شما می توانید توابعی را که محاسبات مورد نیازتان را انجام بدهد نیز ایجاد کنید . یک تابع یک یا چند داده را در ورودی دریافت می کند و پس از انجام محاسبات لازم نتایج را در قالب یک یا چند متغیر خروجی به شما بر می گرداند.خط اول یک تابع که خط تعریف تابع نیز نامیده می شود باید از ترتیب زیر پیروی نماید :
ـ کلمه function
ـ نام متغیر یا متغیر های خروجی . در صورت وجود بیش از یک متغیر خروجی باید آنها را در کروشه گذاشته و با ویرگول از هم جدا کنید
ـ علامت ـ
ـ نام تابع . پرونده ای که تابع در آن ذخیره می گردد باید دارای همین نام با دنباله m . باشد .
ـ آرگومان یا آرگومانهای ورودی (که با ویرگول از هم جدا شده باشند )در داخل پرانتز.
برای مثال تابع زیر ، که باید در پرونده ideal.m ذخیره گردد، حجم گاز کامل را در فشارها و دماهای مختلف محاسبه می نماید:
حال این تابع را می توانید در محیط کار MATLAB در یک برنامه اصلی و یا در تابع دیگری به کار ببرید. مثلاً (نتایج در اینجا نشان داده نشده اند ) :
توصیه می شود در توابعی که می نویسید ، پس از خط تعریف تابع ، کار تابع ونحوه به کار بردن آن را در چند خط توضیح دهید. خطوط توضیح پیوسته ای که در ابتدای تابع می آیند را می توانید همانند دیگر توابع ودستورهای موجود در MATLAB با استفاده از دستور help مرور کنید.
کنترل جریان محاسبات
MATLAB دارای چندین ترکیب کنترل جریان محاسبات است که به برنامه امکان می دهد که در حین اجرا تصمیمات لازم را اتخاذ کرده و ترتیب اجرای دستورات را کنترل کند. این دستورها در زیر شرح داده می شوند .
– if …(else … ) end دستور if برنامه را قادر می سازد که تصمیم بگیرد که چه دستورهایی باید اجرا گردند . مثال :
عبارتی که دنبال کلمه if می آید باید یک عبارت منطقی باشد. در صورت درست بودن این عبارت منطقی ، دستورهایی که در سطرهای بین if وend قرار دارند، به ترتیب اجرا میگردند ودر صورت نادرست بودن این عبارت منطقی ،دستورهای گفته شده نادیده گرفته می شوند.شما همچنین میتوانید از دستور else استفاده کنید. مثال:
در این حالت اگر عبارت منطقی مورد نظر درست باشد، مجموعه دستورهای بین if وelse اجرا می گردند ودر غیر این صورت دستورهای بین elseوend قابل اجرا می باشند. For… end ـ دستورfor به برنامه اجازه می دهد که دستورهای درج شده بین for وend را به دفعات معینی تکرار نماید . مثال:
– while…end درمواردی که لازم باشد که در حین اجرای برنامه مجموعه ای از دستورات تکرار گردند ولی تعداد دفعات تکرار معلوم نباشد بلکه این عملیات تا ارضا شدن شرط یا شروط معینی ادامه یابند، می توان از دستور while استفاده نمود. مثال:
همانند آنچه در مورد دستور if گفته شد، عبارتی که به دنبال کلمه while می آید باید یک عبارت منطقی باشد که در واقع همان شرط مورد نظر است .درصورت صادق بودن این عبارت منطقی ،دستورهایی که در سطرهای بین while وend قرار دارند به ترتیب اجرا می گردند تاجایی که شرط مورد نظر دیگر برقرار نباشد.
– switch…case…(otherwise…) end وقتی که لازم باشد که برنامه بر حسب مقادیر مختلف یک متغیر ، متناظراً دستورهای متفاوتی را اجرا کند ،به کار بردن ترکیب switch-case راحت تر از بکار بردن چندین دستور if متداخل است. مثال:
– pause ,break دو دستور مفید دیگر که در برنامه نویسی می توانند مورد استفاده قرار گیرند. عبارتند از – pause ,break شما می توانید در صورت لزوم قبل از کامل شدن حلقه به کمک دستور break از آن خارج شوید. هنگامی که برنامه در حین اجرا به دستور pause برسد متوقف می ماند تا اینکه شما کلیدی را روی صفحه کلید فشار دهید و سپس اجرای برنامه از دستور بعد از pause ادامه می یابد. مثال :
در مثال فوق ، برنامه هر بار پس از نشان دادن مقادیر k وy متوقف می ماند تا اینکه کلیدی روی صفحه کلید فشرده شود. سپس حلقه for بار دیگر تکرار می گردد و این عمل آنقدر ادامه می یابد تا اینکه مقادیر k از 5 بیشتر شود. در این موقع دستور break باعث خروج برنامه از حلقه for ( ودر این مثال پایان اجرای برنامه ) می شود.
خطایابی برنامه ها
شما می توانید از راههای زیر ، برنامه هایتان را خطایابی (debugging ) نمائید :
ـ برنامه را به چند بخش کوتاهتر تقسیم کنید و هر بخش را جداگانه امتحان کنید.
ـ نتایج محاسبات را در مراحل میانی جریان برنامه بنویسید.این کار رامی توانید به آسانی با برداشتن (; ) semicolonاز انتهای دستور محاسباتی و یا نوشتن نام متغیر مورد نظر انجام دهید.همچنین می توانید با قرار دادن disp در مکانهای مشخصی از برنامه در یابید که برنامه تا کجا به پیش رفته است .
ـ تا حد امکان سعی کنید که از عملیات ماتریسی استفاده کنید ودر برنامه از تعداد حلقه هایی که همان کار را انجام میدهند بکاهید .
ـ خطوط مورد شک برنامه را بطور جداگانه در محیط کار MATLAB اجراکنید (ترجیحاً به کمک copy -past )تا درستی و یا نادرستی محاسبه را دریابید.
ـ دقت کنید که پیغام خطا روی چه سطری از برنامه داده شده است و بویژه دقت کنید که پیغام خطا چه می باشد وچه معنایی دارد.
ـ امکانات خطایابی موجود در نرم افزار را به کمک بگیرید.
پیغامهای خطا
بیشترین حجم پیغامهای خطایی که شما در ابتدای کار باMATLAB دریافت می کنید مربوط به عملیات و جایگزینی های برداری/ماتریسی است . دراین بخش نحوه تصحیح برنامه را با استفاده از پیغامهای خطای دریافتی با ذکر یک مثال نشان داده می شود. در نظر بگیرید که می خواهید سطحPVT را براساس قانون گاز کامل رسم کنید .داده های ورودی به برنامه محدوده های فشار و دما به صورت برداری هستند و برنامه باید حجم ویژه گاز را محاسبه نماید و سپس سطح را رسم کند . بهتر است که محاسبه حجم در یک تابع جداگانه انجام گیرد تا اگر بخواهید محاسبه را با معادله حالت دیگری نیز تکرار کنید . نیازی به نوشتن مجدد برنامه اصلی نداشته باشیدو فقط تابع محاسبه حجم را تغییردهید.فرض کنید که برنامه اصلی و تابع مورد نیاز را در وهله اول به صورت زیر ایجاد کرده اید:
حال در صورتی که این برنامه را اجرا کنید ،پیغام خطای زیر را دریافت می کنید:
همانطور که ملاحظه می کنید اشکال از سطر 6 برنامه اصلی که مربوط به مراجعه به تابع است گرفته شده ودرحقیقت خطا درسطر4تابع ومشخصاً درنحوه تقسیم دوبردار t وP وجود دارد.به یاد بیاورید که در عملیات ماتریسی ، ابعاد ماتریسهاباید اجازه انجام چنین عملی را بدهد.دراینجا با دو بردار t وp نمی توان عمل تقسیم را انجام دادواصولاًدر این مسئله مقصود از عبارت بکار برده شده برای محاسبه حجم گاز کامل انجام محاسبه ماتریسی نمی باشد.بنابراین سطر 4 تابع idealm به شکل زیر تغییر داده می شود (بکار بردن تقسیم عضو به عضو بجای ماتریسی )تامحاسبه حجم به صورت ماتریسی صورت نگیرد:
اما با اجرای مجدد برنامه می بینیدکه مشکل حل نشده است:
اگر تعداد مولفه های بردارهای t وp رادرمحیط کارMATLAB بخواهیم:
دیده می شود که این دو بردار هم اندازه نیستند وبنابراین عملیات عضو به عضو نیز نمی توان بر روی آن دو انجام داد.دراینجا چاره ای نیست جز آنکه یک حلقه در محاسبات استفاده نمائید و مقادیر حجم ویژه را برحسب دما، هر بار در یک فشار معین ، محاسبه نمایید :
اما این بار نیز با پیغام خطا مواجه می شوید :
توجه کنید که بردار دما یک بردار سطری است و در نتیجه سمت راست عبارت محاسبه حجم یک بردار سطری خواهد بود . این در حالی است که در سمت چپ همان عبارت یک بردار ستونی قرار دارد و پیغام خطا نیز از همین جا ناشی می شود .بنابراین تابع ideal.m باید به شکل زیر تصحیح گردد.
این بار با اجرا کردن برنامه اصلی پیغام زیر را مشاهده می کنید :
باز هم پیغام خطا ! اما اگر دقت کنید می بینید که این بار پیغام خطا مربوط به تابع ideal.m نیست بلکه خطا از دستور مربوط به رسم داده ها گرفته شده است . در حقیقت تابع کار خود را به خوبی انجام داده و رفع اشکال شده است . خطای این دفعه مربوط به اشتباه در نام متغیر است . متغیر v که قبلاً تعریف شده است اشتباهاً در دستور surf با نام vol قبلاً تعریف نشده است و در نتیجه MATLAB آن را نمی شناسد . پس از تصحیح این سطر ،برنامه اصلی به صورت زیر خواهد بود .
اجرای این برنامه پیغام زیر را به دنبال خواهد داشت :
خطای این دفعه باز هم مربوط به دستور surf و این بار درباره نحوه معرفی آرایه ها به آن است . با مراجعه به توضیحات help)) این دستور مشخص می گردد که آرگومانهای اول و دوم این دستور می توانند بردار باشند ولی آرگومان سوم باید ماتریس باشد . در این حالت طول آرگومانهای اول و دوم باید به ترتیب برابر با تعداد ستونها و سطرهای آرگومان سوم باشد . لذا طبق این توضیحات متغیرv باید آرگومان سوم دستور surf باشد و ضمناً با مشاهده ابعاد این متغیر
می توانید بگوئید که آرگومان اول باید بردار t و آرگومان دوم باید بردار p باشد . بنابراین برنامه اصلی باید به شکل زیر اصلاح گردد:
در صورت اجرای برنامه نتیجه نهایی را خواهید دید .
دستورهای echo و keyboard
بکار بردن دستور echo باعث می گردد که هر سطر از برنامه اصلی قبل از آنکه اجرا گردد روی صفحه نمایش نشان داده شود . بنابراین ترتیب اجرای دستورات مشخص می شود . این دستور بویژه هنگامی که در برنامه حلقه ها و دستورات شرطی متعدد وجود دارد می تواند مفید واقع شود . در صورتی که بخواهید این دستور در هنگام اجرای تابع خاصی بکار بیافتد باید نام تابع مورد نظر را بعد از echo بیاورید . به هر حال ، این دستور در بسیاری از موارد کمک چندانی به پیدا کردن خطای برنامه نمی کند زیرا در بیشتر موارد MATLAB سطری که برنامه در آن متوقف شده است را مشخص می نماید . در صورت استفاده از دستور keyboard در میان برنامه ، اجرای برنامه هنگامی که به آن دستور می رسد موقتاً متوقف می گردد و به شما اجازه می دهد که عملیات مورد نظرتان را انجام دهید . در چنین حالتی علامت را روی صفحه نمایشگر مشاهده خواهید نمود . برنامه پس از آن که دستور return را وارد نمودید از جایی که متوقف شده بود ، ادامه می یابد . این دستور بویژه در مواقعی بکار می رود که برنامه بواسطه اندازه و یا مقدار یک متغیر پیغام خطا می دهد . شما با استفاده از دستور keyboard امکان می یابید که اندازه یا مقدار متغیر مورد سوال را دیده و یا آن را تغییر دهید و پس از استفاده از دستور return اثر این تغییر را در اجرای ادامه برنامه مشاهده نمائید.
فصل چهارم
آشنایی با Matlab و Image Processing Toolbox
همه با Matlab آشنا هستیم و حداقل می دانیم که چیز بدردخوری است. پس از صحبت درباره این می گذریم. اما Image Processing Toolbox از امکانات جنبی این برنامه است. برای اینکه مطمئن شوید که این Toolbox روی Matlab شما نصب شده است؛ دستور ver را اجرا کنید. این دستور لیست هرچه که از Matlab روی رایانه شما نصب شده است را ارائه می دهد. بین Matlab 5.x و Matlab 6 برای کار پردازش تصویر تفاوت چندانی وجود ندارد اما مثل همیشه نسخه جدیدتر امکانات بیشتری دارد که البته فعلا با آنها کاری نداریم.
دستور های معرفی شده: ver
چگونه یک فایل تصویر را در Matlab باز کنیم
Matlab می تواند فایل های گرافیکی با فرمت های JPEG, TIFF, GIF, BMP, PNG, HDF, PCX, XWD, ICO, CUR را به عنوان فایل گرافیکی بخواند. مثلاً برای وارد کردن تصویری به نام cameraman.tif به فضای Matlab کافی است از دستور imread استفاده کنیم:
MyImage=imread('cameraman.tif','tif');
توجه داشته باشید که فایلی که دستور خواندنش را می دهید باید برای برنامه قابل دسترس باشد. یعنی یا باید در مسیر (Path) Matlab باشد یا اینکه در پرونده ای (folder) قرار داشته باشد که در حال حاضر برنامه به آن دسترسی دارد. برای اینکه بدانید که Matlab برای پیدا کردن فایلی که دستورش را دادید کجا را خواهد گشت اینکارها را بکنید: از دستور path برای اینکه بدانید کدام پرونده ها جزء مسیر پیش فرض Matlab است و از دستور dir برای اینکه بدانید که Current Directory چیست؛ استفاده کنید.
خب تا اینجا یک فایل تصویر را در محیط Matlab وارد کرده ایم. همانطور که می دانیم یک تصویر دیجیتال بر روی کامپیوتر در قالب یک ماتریس ذخیره می شود. پس MyImage مثل همه متغیرهای Matlab یک ماتریس است. برای اینکه بدانیم فایل خوانده شده از چه فرمتی است(سیاه سفید، یا Gray Scale یا رنگی ) می نویسیم:
imfinfo('cameraman.tif')
این دستور را اجرا کنید و ببینید چه می نویسد… اما اگر بخواهید بدانید که ماتریس ذخیره شده MyImage از چه نوعی است کافی است بنویسد: whos و لیست متغییرهای مقیم شده در حافظه و نوع و اندازه آنها را ببینید.
دستورهای معرفی شده: imread, imfinfo, whos, path, dir
چطور تصویر را ببینیم؟
خب حالا می خواهیم تصویر را که در یک ماتریس ذخیره شده است را ببنیم. بنویسید:
imshow(MyImage)
جالب است نه؟ فکر می کنید اگر بخواهیم دوتا تصویر را با هم ببنیم باید چکار کنیم؟ این را امتحان کنید:
YourImage=imread('tire.tif','tif');
figure
subplot(1,2,1), imshow(MyImage), title('MyImage')
subplot(1,2,2), imshow(YourImage), title('YourImage')
با اجرای این دستورات به آن چیزی که اتفاق افتاد توجه کنید؛ حتما متوجه می شود که هرکدام از این دستورات چکار می کنند.
دستورهای معرفی شده: imshow, subplot, title, figure
تصویر را خواندیم حالا چکار کنیم؟
کمی نویز دست وپا می کنیم و به تصویر اضافه می کنیم که بعداً راهی پیدا کنیم حذفش کنیم:
imagen=imnoise(MyImage,'salt & pepper');
imshow(imagen)
دستور imnoise نویزهای مختلفی را در اختیار ما می گذارد که به تصویر اضافه کنیم. افزودن نویز برای شبیه سازی اشکالاتی است که ممکن است به هر سیستم پردازش تصویر وارد شود. اینجا فرض کرده ایم که نویز "نمک و فلفل" به تصویر اضافه شده است! اسمش عجیب غریب است؟ این نویز را روی تصویر تلویزیون تان اگر آنتن درست تنظیم نباشد حتما دیده اید. می دانیم که وقتی نویز داریم با یک فیلتر حذفش می کنیم. فیلتری که انتخاب می کنیم باید مناسب نویزی باشید که روی تصویر سوار شده است. بهترین فیلتر برای نویز "نمک و فلفل" فیلتر میانه است که در Matlab با دستور Medfilt2 قابل استفاده است:
figure
imagefilt=medfilt2(imagen);
imshow(imagefilt)
برای دست گرمی هم که شده سعی کنید تصویر نویز و تصویر فیلتر شده را در یک صفحه واحد نمایش دهید.
دوباره به تصویر MyImage نگاه کنید. فرض کنید می خواهیم مارک دوربین درون عکس را از روی شکل آن تشخیص دهیم. بازهم فرض کنید به روشی که بعدا بیشتر راجع بهش صحبت می کنیم فهمیدیم که دوربین درون این مختصات از تصویر قرار دارد. بین سطر 59 تا 84 و ستون 131 تا 170. پس از همین مختصات تصویر را با دستور imcrop می بریم.
imagecrop=Imcrop(MyImage,[ 131 59 39 25]);
در این دستور مختصات برش را اینطور می نویسم ] ارتفاع ,پهنا ,حداقل y ,حداقل x [. این قسمت بریده شده را نمایش بدهید و ببینید. در مرحله بعد سیستم تشخیص دهنده نوع دوربین احتیاج دارد که اندازه تصویر مقدار خاصی مثلاً 120×100 باشد. پس باید اندازه تصویر برش داده شده را تغییر دهیم:
imagesz=imresize(imagecrop,[120 100]);
تصویر جدید را نگاه کنید. می بینید که به اندازه جدید در آمده است.
دستورهای معرفی شده: imnoise, medfilt2, imcrop, imresize
کمی خلاقیت مهندسی!
یک فایل جدید باز می کنیم که عکسی از دانه های برنج است. می خواهیم دانه های برنج را درون عکس بشماریم. این عکس از قسمت برنج مرغوبِ خط تولید یک کارخانه است. شمارش دانه های برنج به کارخانه برنج سازی کمک می کند بداند چند درصد برنج هایش درجه یک هستند. این دستورات را اجرا کنید:
p=imread('rice.tif');
re=edge(p,'sobel');
imshow(re)
re2=edge(p,'canny');
figure, imshow(re2)
البته اول تصویر اصلی برنج ها را ببینید و سپس مقایسه کنید. دو روش Sobel و Canny برای پیدا کردن لبه ها مورد آزمایش قرار گرفته است. مشخص است که روش Canny اینجا بهتر جواب داده است. دو کار به عهده شماست.
a. الگوریتمی پیدا کنید که تعداد برنج های درون عکس را بشمارد. (راهنمایی: اگر بتوانید تعداد مسیرهای بسته ی درون تصویر لبه ها را بشمارید تقریباً همه برنج ها را شمرده اید)
b. کشف کنید که روش 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 سکه بیشتر درون تصویر وجود ندارد! اشکال از کجاست؟…. راه حلی هم برای این به ذهنتان می رسد؟
ربات مسیریاب توسط پردازش تصویر
ما پروژه را رو (ربات مسیریاب توسط پردازش تصویر) به چند بخش تقسیم می کنیم و هر بخش رو بصورت مجزا آموزش میدم. این ربات توسط یک دوربین فیلم برداری ساده مثل وبکم کامپیوتر و یا حتی سادتر٬ بطور مکرر از مسیر تصاویری تهیه تولید می کنه (پایان مرحله اول) در مرحله بعدی این تصاویر پردازش و مسیر حرکت ربات از اطلاعات بدست آمده از آنها استخراج می شود (پایان مرحله دوم) و در مرحله آخر کاری که میکروکنترلر در رباتهای عادی انجام می دهد ما با استفاده از پورت های کامپیوتر انجام داده و فرامین حرکتی را برای سیستم کنترل موتورهای ربات ارسال می کنیم (چپ گرد٬ راست گرد). اما بیاد مراحل رو از وسط شروع کنیم! یعنی مرحله پردازش تصویر. فکر می کنیم یه تصویر توسط دوربین در محیط مطلب در اختیار ما قرار داده شده و ما پردازشات لازم جهت استخراج مسیر حرکت رو روی اون انجام میدیم٬ تا بعدا برسیم به مراحل بعدی… مقدمه دیگه بسه بریم سر اصل مطلب:
اگر همونطور که گفتم به یه کتاب مطلب نگاهی انداخته باشید حتما از همون ابتدای امر متوجه شدید که در این نرم افزار اکثر عملیات ها برپایه ماتریس ها انجام میشه (ضرب٬ تقسیم٬ جمع٬…). مطلب یجورایی شبیه یه زبون برنامه نویسی هستش و ما در اون از متغیرها٬ عملگرها و توابع و… بسبک زبانهای برنامه نویسی جهت حل مثائل خودمون استفاده می کنیم. اصلا بیاید یه مثال عملی بزنیم:
>> I = 1:10
I =
1 2 3 4 5 6 7 8 9 10
اجرا کردن دستور I = 1:10 باعث ایجاد یک متغیر به نام I و به شکل یک ماتریس یک بعدی با محتوای ۱ تا ۱۰ می شود (این اولبن و آخریم مثال سطح پایینم بود! توقع دارم اینارو خودتون با خوندن یک کتاب یاد بگیرید) حالا بریم سراغ یک مثال تخصصی:
RGB = imread('peppers.png'); ٪متغیر = imread('مسیر ونام فایل تصویر');
imshow(RGB);
تابع "imread" یکی از توابع جعبه ابزار پردازش تصویر می باشد که جهت لود کردن یک فایل توصویری در یک متغیر به سبکی که مشاهده می کنید استفاده می شود. می بینید که در کادر متغیرها (بطور پیشفرض کادر بالا سمت چپ میحیط مطلب) متغیر RGB با ابعاد <384x512x3 unit8> ایجاد شده است. یعنی یک ماتریس سه بعدی که بعد اول ۳۸۴ خانه و معرف تعداد پیکسلهای ارتفاع تصویر٬ بعد دوم ۵۱۲ پیکسل طول تصویر و بعد سوم ۳ خانه که چون تصویر از نوع رنگی (RGB) می باشد یک خانه حاوی مقدار RED و خانه های بعدی نگدارنده مقادیر GREEN و BLUE پیکسل مورد نظر می باشد.
unit8 نوع تصویر RGB در مطلب را مشخص می کند. باید بدانید سه نوع مکعب رنگ unit8, unit16 و Double برای تصاویر رنگی در مطلب در نظر گرفته شده است. برای مثال در کلاس unit8 هر بعد مکعب که بیانگر یکی از رنگهای قرمز٬ سبز و آبی می باشد دارای ۲۵۶ (۲۸) مقدار تعیین شده می باشد که در کل ۲۵۶*۲۵۶*۲۵۶= ۲۲۴ رنگ مختلف تولید می شود. برای کلاسهای دیگر هم بهمین روال می باشد با این تفاوت که تعداد رنگ آنها بیشتر می باشد.دستور بعدی (خط دوم)٬ دستور "imshow" جهت نمایش تصاویر موجود در متغیر ها با فرمت ذکر شده می باشد. بعد از فراخوانی این دستورات ابتدا اطلاعات موجود در تصویر 'peppers.png' (موجود در مسیر جاری مطلب) داخل متغیر RGB ریخته شده و با دستور imshow مرورگر تصاویر نرم افزار عکس مربوطه را نمایش می دهد.
افزایش کنتراست تصویر
خوب حالا بیاید یکم کارای پردازشی روی تصاویر انجام بدیم. تصویر pout.tif رو در یک متغیر لود کنید و اون رو نمایش برای خودتون بدید (دقیقا مثل کد زیر). می بینید که این عکس کنتراست پایینی داره !
I = imread('pout.tif');
imshow(I);
برای مشاهده نحوه توزیع شدت رنگ در یک تصویر می توانید با صدا زدن دستور 'imhist' نمودار هیستوگرام آن را رسم کنید.
figure, imhist(I);
می بینید که در شکل بالا رنج شدت نازک می باشد و تمام پتانسیل ۰ تا ۲۵۵ را پوشش نمی دهد بدین معنی که بخشی از مقادیر بزرگ و بخشی از مقادیر کوچک را که باعث ایجاد کنتراست بالا می شوند را در خود ندارد.
در این جعبه ابزار روشهای گوناگونی جهت افزایش کنتراست یک تصویر در نظر گرفته شده است که یکی از آنها استفاده از تابع histeq جهت پخش کردن مقادیر شدت در کل رنج پتانسیلی تصویر می باشد. با اجرای این دستورات به ترتیب زیر می بینید …
I2 = histeq(I);
figure, imshow(I2);
بهمین روش می توانید تصاویر دیگری را جهت تمرین وارد این محیط کرده و میزان کنتراست آنها را افزایش دهید.
قابلیتی هستش که با استفاده از اون می تونید اجزاء کوچک یا ضائد موجود در یک تصویر رو از بین ببرید در حالی که به اجزاء بزرگتر و یا باشکل مورد نظر شما هیچ خدشه ای وارد نشه! برای مثال می تونید در تصویر نقشه فیبر یک مدارچاپی خطوط سیمهای اتصال رو از بین ببرید در حالی که جای قطعات بزرگتر مثل آیسی های و… لطمه ای نزنید. (خیلی گنگه؟ یه مثال دیگه) فرض کنید تصویر یه قطره خون زیر میکروسکوپ را دارید که مثلا داخلش انواع گلوبول سفید و قرمز هزار جور ذره دیگه با سایزهای کوچیک و بزرگ هستش. حالا اگر بخواید تعداد گلوبول سفیدارو بشمارید مجبورید اول ذرات کوچکترو حذف کنید و بعد تعداد کل ذرات باقیموندرو بشمارید! اصلا بیاید با همین مثال شروع کنیم:
1. I = imread('nodules1.tif');
2. level = graythresh(I)
3. bw = im2bw(I,level);
4. bw = ~bw;
5. imshow(bw);
خوب توضیحات رو با شماره خطوط پیش می برم. خط اول کد رو که جلسه پیش توضیح دادم برای خواندن یک تصویر از آدرس مورد نظر در یک متغیر هستش. نصویر مورد نظر ما در اینجا یک تصویر grayscale یا سیاه و سفید هستش. حتما قبل از اجرای دستور دوم یکبار (Imshow(I رو اجرا کنید تا این تصویر سیاه و سفید رو ببینید. خط دوم و سوم از دو تابع im2bw و graytresh به صورت پشت سرهم استفاده شده .
تصاویر در مطلب انواع مختلف دارن از جمله رنگی یا RGB و سیاه سفید Grayscale و یا باینری و… توابع مختلفی جهت تبدیل این نوعها به هم تعبیه شده که از جمله اونها im2bw هست که جهت تبدیل انواع تصاویر به نوع باینری که تنها دارای نقاط سیاه و سفید هستش بکار میره. این تابع تصویر ورودی رو اول به نوع سیاه سفید تبدیل می کنه و در مرحله بعدی اون رو به یک تصویر باینری تبدیل می کنه. تصویر باینری خروجی BW به ازاء تمام پیکسل هایی که مقدار روشنایی آنها کمتر از مقدار level باشد مقدار ۰ (یا سیاه) و برای بقیه پیکسلها مقدار ۱ (یا سفید) اختیار خواهد کرد.
(level = graythresh(I : همیشه برای بدست آوردن این حدآستانه level که در تابع بالایی استفاده می شود از تابع graythresh با ورودی تصویر مورد نظر استفاده می کنیم و بعد این level را در توابعی همچون im2bw استفاده نماییم.
قبل از اجرای دستور خط چهارم حتما یکبار دستور (imshow(BW را جهت مشاهده تصویر باینری تولید شده اجرا کنید. مشاهده می کنید تمام نقاط به رنگ سیاه و بقیه تصویر سفید می باشد (تصویر باینری فقط دارای نقاط ۰ سیاه و ۱ سفید می باشد). حالا فرض کنید بخوایم این حالتو برعکس کنیم یعنی نقاط سفید و زمینه سیاه باشه باید از دستور خط ۴ استفاده کنیم. می بینید که علامت ~ در مطلب مثل NOT منطقی عمل کرده و تمام نقاط صفر رو یک و یک رو
صفر کرده. با اجرا دستور خط ۵ یکبار دیگه تصویر تولید شدرو ببینید.
یه مراحلی رو طی کردیم که خود این مراحل هم فقط جنبه آموزش داشتن وگرنه همون تصویر سیاه و سفید اول رو هم می تونستیم ذرات ریزش رو باهمین روشی که در زیر توضیح می دم٬ حذف کنیم. اما چون ما در بعضی مثل همینجا به اطلاعات اضافی تصویر احتیاجی نداریم و همچنین چون سرعت پردازشات روی تصاویر باینری بسیار بالاتر هستش٬ در صورت لزوم یه همچین مراحلی رو ابتداعا طی می کنیم و تصویر باینری ایجاد می کنیم. خوب حلا بریم سر اصل قضیه که حذف کردن ذرات ریز باشه:
1. se = strel('disk',5);
2. bw2 = imopen(bw,se);
3. imshow(bw);
4. figure, imshow(bw2);
(IM2 = imopen(IM,SE : اصل قضیه Morphological Opening همین تابع imopen هستش که دارای دو ورودی٬ یکی تصویر مورد نظر (IM) و دیگری یک المان ساختاری (SE) هستش که مشخص کننده خصوصیات اجزایی که باید از تصویر حذف بشن٬ از جمله شکل و بزرگی آنها هستش.
(SE = strel(shape,parameters : این تابع تولید کننده همون المان ساختاری مصرف شده در تابع بالاس. این تابع بر اساس ورودی هایی که بهش داده میشه یک ماتریس دوبعدی از صفر و یک ها میسازه که نقاط ۱ در کنار یکدیگر یک جزء کوچک رو میسازن و تابع imopen با توجه به این ساختار اجزایی که کوچکتر از این جزء هستند رو از تصویر حذف می کند. پس بایستی دقت کنیم ساختار تولید شده در این دستور نه خیلی کوچک باشد که اجزاء ضاید را در بر نگیرد و نه خیلی بزرگ باشد که برخی از اشکال تصویر که قصد حذف شدن آنها را نداریم نیز از بین بروند!
ورودی shape یک رشته است که یکی از چند حالت 'disk', 'ball, 'octagon,.. را که مشخص کننده شکل ساختار تولید شده است٫ می باشد. بر اساس رشته shape وارد شده پارامترهای متفاوتی را جهت مشخص کردن سایز آن بایستی در ورودیهای بعدی وارد کنید که جزئیات بیشتر را با جستجو کردن نام تابع 'strel' در راهنمای مطلب بیابید. اما برای نمونه
(SE = strel('disk',R باعث ایجار یک ساختار دیسک شکل با شعاع R به صورتی که در شکل مشاهده می کنید می شود.
خوب با صدا زدن دو دستور خط ۱ و ۲ المان ساختاری مورد نظر تولید شده و تمام اجزایی که کوچکتر از این ساختار باشند توسط دستور imopen حذف می شوند و خروجی در متغیر bw2 قرار می گیرد. کد خط چهارم همانطور که می دانید تصویر bw را نمایش می دهد و کد خط ۵ باعث ایجاد یک پنجره تصویر جدید و نمایش bw2 در آن می شود. پس همزمان می توانید تصویر اصلی و اصلاح شده آن را مشاهده نمایید. که خروجی چیزی شبیه شکل زیر خواهد شده.
مراجع :
* "اصول کنترل مدرن" تالیف دکتر علی خاکی صدیق
* "جعبه ابزارهای مطلب" تالیف امیر گودرز چگنی وند
* http://www.avr.ir
* http://www.eeuok.com
* http://www.autoir.com
* http://www.CentralDLC.com
* http://www.notronic.blogfa.com
* http://www.azizkhani.mihanblog.com
60