راهنمای یادگیری پردازش تصویر (Image Processing)
يكشنبه, ۲۳ ارديبهشت ۱۳۹۷، ۰۳:۵۲ ب.ظ
این مطلب در ویرگول منتشر شده است.
توی این پست قراره که به شما آموزش گام به گام چگونگی یادگیری پردازش تصویر رو بهتون بگم و این که توی این مسیر به چی نیاز دارید و ندارید رو بنویسم. داخل پارانتز اینو هم عرض کنم که بنده خودم شخصن در حال اتمام یادگیری پردازش تصویر هستم و نوشتههای پایین حاصل تجربیات شخصی بنده است، اگر مطلبی از نظر شما اشتباه بود خوشحال میشم توی کامنتها به من بگید تا اصلاحش کنم. پیشاپیش متشکرم.
پردازش تصویر به صورت خلاصه یعنی اینکه شما با انجام فرایندهایی روی تصویر (چه عکس چه ویدئو)، خروجی مشخص و معینی از تصویر (باز هم به صورت تصویر) بگیرید. این فرایندها میتوانند برای افزایش دقت تصویر باشند (Image enhancement) یا میتوانند برای جداکردن یک بخش مشخص از تصویر(Image segmentation) باشند و... . برنامههایی مانند اینستاگرام، کماسکنر و... از الگوریتمهای مربوط به پردازش تصویر استفاده میکنند. در ادامه مقاله گامهای یادگیری پردازش تصویر براش شما آورده شده.
گام اول - پیشنیازهای ریاضی
پردازش تصویر (Image Processing) زیرمجموعهای از پردازش سیگنال (Signal Processing) است و این بدان معناست که شما با سیگنالها سر و کار دارید و این به معنای پیشنیاز ریاضی قویاست. مهمترین مطلبی که شما از ریاضی برای پردازش تصویر نیاز دارید، بحث سری و تبدیل فوریه است (که دانشجویان مهندسی در درس ریاضیات مهندسی با آن آشنا میشوند) و اگر این مطالب را بلد نباشید با انتگرالهای وحشتناک و عجیب و غریبی مواجه خواهید شد! پس از آن شما به مهارت قابل قبولی در جبر خطی (عمدتاً ماتریسها) در حد دبیرستان نیاز دارید. اگر اینها را بلد باشید، تقریباً آمادگی لازم برای شروع یادگیری پردازش تصویر را دارید!
سوالی که برای خیلیها با آن برخورد میکنند، این است که آیا ما واقعاً به ریاضی برای مطالبی چون پردازش تصویر و هوش مصنوعی نیاز داریم؟ پاسخ این است که بله! شما برای فهمیدن تئوری پردازش تصویر به ریاضی نیاز دارید. اصولاً برنامه نویسی برای پردازش تصویر و هوش مصنوعی سخت نیست، بلکه فهمیدن تئوری آن است که وقت و انرژی فراوانی را از شما میگیرد.
منبع رایگان و خوب برای یادگیری ریاضی فراوان است، من به شخصه مکتبخونه را پیشنهاد میکنم ولی خودتان میتوانید از هر منبعی که راحت هستید استفاده کنید.
گام دوم - برنامه نویسی
دو راه برای برنامه نویسی در حوزه پردازش تصویر در پیش دارید: 1- استفاده از پایتونو یا سیپلاسپلاس و کتابخانهی OpenCV 2- استفاده از نرمافزار Matlab.
اینی که شما از کدام راه میروید به خودتان بستگی دارد؛ ولی باز هم کمی در مورد هر کدام توضیح میدهم.
پایتون زبان برنامه نویسی اوپن سورس (به معنای مصطلح و عامش یعنی رایگان) بوده و به همین علت منبع یادگیری پایتون به شدت فراوان است. از طرفی کتابخانه OpenCV هم اوپن سورس بوده و توسعهی آن آزاد است.
از طرف دیگر متلب اوپن سورس نیست و لایسنس کامل آن 100000 دلار (اشتباه تایپی نیست، صد هزار دلار آمریکا!) هزینه دارد. (نترس بابا ما کرک شدشو استفاده میکنیم تو ایران :))) متلب گزینهی مناسبی برای گروههای تحقیقاتی و پروژههای دانشگاهیست و شما میتوانید از کد متلب خروجی c یا c++ بگیرید! همچنین میتوانید به کمک متلب بر روی بردهای رزبریپای برنامه بنویسید. بهترین ویژگی متلب، مستندات (Documentation) کامل آن است(در اکثر موارد، هر کد با مثال عملی همراه است).
متاسفانه بسیاری فکر میکنند که متلب صرفاً یک ماشین حساب سنگین است، در صورتی که اینگونه نیست. متلب یک محیط توسعه برنامه است که کاربردهای بسیار زیادی دارد. از هوش مصنوعی و پردازش سیگنال گرفته تا حل معادلات PDE. متلب زبان مخصوص خودش را داراست (که شباهت زیادی به پایتون دارد) و میتوانید کتابخانههای دیگر (Add-ons) را نیز از طریق فروشگاهش (اغلب به صورت رایگان) نصب کنید.
سیپلاسپلاس هم مانند پایتون اوپن سورس است ولی با این تفاوت که یادگیری و کار کردن با آن خیلی سخت و زمانبر است. همچنین سرعت اجرای سیپلاسپلاس خیلی بیشتر از پایتون است و به همین علت در صنعت کاربرد فراوانی دارد.
اصطلاحاً پایتون زبان Fast Prototyping است. به این معنا که شما به کمک پایتون میتوانید نمونههای اولیه را با سرعت نسبتاً بالایی توسعه بدهید. ولی به علت سرعت اجرای نسبتاً پایین (برای کاربردهای زمانبر) نمیتوان کار خیلی پیچیدهای با آن کرد!
من به شخصه متلب را برای یادگیری پردازش تصویر توصیه میکنم، چون:
- منابع درجه یک (مانند رافائل گونزالز و وایلی) از متلب برای آموزش پردازش تصویر استفاده کردهاند.
- زبان متلب و پایتون بسیار به هم شباهت دارند، اگر پایتون بلدید، یادگرفتن متلب برای شما کاری ندارد. حتی بین کدهای پردازش تصویر متلب و OpenCV هم شباهت وجود دارد!
- سرعت اجرای برنامهها در متلب بیشتر از پایتون است.(ولی به پای سیپلاسپلاس نمیرسد!) میتوانید از برنامههای خود خروجی c و c++ بگیرید. میتوانید با کمک متلب برنامهی برد رزبریپای را هم برنامهنویسی کنید.
- مستندات متلب بسیار کاملتر از پایتون و کتابخانهی OpenCV است (ولی جامعهی آماری استفاده از آن کمتر از پایتون است.)
گام سوم - مفاهیم پردازش تصویر
همانطور که پیش از این نیز اشاره کردم، شما باید مفاهیم پردازش تصویر را عمیقاً یادبگیرید تا بتوانید از آن در پروژههایتان استفاده کنید. معروفترین و بهترین منبع برای شروع یادگیری پردازش تصویر، کتاب «پردازش تصویر دیجیتالی» نوشتهی رافائل گونزالز و ریچارد وودز است که در ایران به نام رافائل گونزالز شناخته میشود.
این کتاب مفاهیم پیچیده را به زبان خیلی ساده توضیح میدهد و شما را زیاد درگیر مفاهیم ریاضی نمیکند. اگر میخواهید همزمان با یادگیری مفاهیم پردازش تصویر، به کمک متلب برنامه هم بنویسید، کتاب زیر را به شما توصیه میکنم. این کتاب مطالب کتاب بالا را با مثالهایی از متلب پوشش داده.
اما من خودم به شخصه با کتاب وایلی شروع کردم. کتاب وایلی هم به زبان ساده توضیح میدهد ولی به اندازهی رافائل گونزالز جامع و کامل نیست و شما مجبورید در کنار آن از منابع دیگر هم استفاده کنید.
اگر دنبال یک منبع ویدئویی خوب میگردید، دورههای کورسرا را به شما پیشنهاد میکنم. دورهی «اصول پردازش تصویر و ویدئوی دیجیتالی» توسط آگلوس کاتساگلوس در Northwestern University تهیه شده. تنها نکات منفی این دوره تکیهی بیش از حد مدرس به مفاهیم ریاضی و لهجهی یونانی وی است. همچنین بعد از هفتهی هشتم، مطالب به شدت پیچیده و به درد نخور به نظر میآیند و برای افراد مبتدی اصلاً جذاب و خوب نیست.
احتمالاً همینها برای شروع کار شما کافی هستند و نیازی به منبع جداگانه ندارید. ولی محض اطمینان چند پلیلیست از یوتیوب را برای فهم بیشتر و بهتر معرفی میکنم.
پلی لیست پایین هم صرفا برنامه نویسی پردازش تصویر را با استفاده از OpenCV آموزش میدهد.
صرفاً به منابع بالا اکتفا نکنید، از هر منبعی که حس میکنید به یادگیری شما کمک میکند استفاده کنید. به خاطر داشته باشید:
شما هرگز نمیتوانید کل بحث پردازش تصویر را به صورت کامل یاد بگیرید. سعی کنید با سرفصلها آشنا شوید و موارد استفاده هرکدام را یاد بگیرید و دنبال کاربردهای عملی این بحثها در زندگی روزمره یا حرفهای خود بگردید و صرفاً به یادگیری تئوری اتکا نکنید.
اگر نظر، پیشنهاد یا انتقادی دارید خوشحال میشم از لینک پایین با من در میون بذارید. موفق باشید.