دستکاری تصاویر (۴) – عملیات ریاضی و ترکیب تصاویر رنگی در OpenCv

یادآوری چگونگی سر ریز شدن متغیر ها 

با توجه به اینکه برای تصاویر در OpenCV از نوع داده‌ای unit8 یعنی عدد صحیح بدون علامت ۸ بیتی استفاده میکنیم . پس این نوع ۳ به توان ۸ یعنی ۲۵۶ مقدار مختلف میتواند داشته باشد و مقادیر خارج از ۰ تا ۲۵۵ امکان پذیر نبود و در صورتی که عددی بزرگتر قرار نسبت داده شود متغیر سر ریز می‌شد.

به قطعه کد زیر توجه کنید.

در کد بالا ماتریس دو عنصری a که عناصر آن همه ۱ هستند ، بعد از اینکه عناصرش ۱۰۰ برابر میشوند و به علاوه ۲۵۵می شنود ماتریس [۲۵۵ ۲۵۵] ساخته میشود ولی بعد از افزایش به اندازه ی ۱۶۰ واحد در هر عنصر از ماتریس b ماتریس [۴ ۴] ساخته میشود چون سرریز صورت گرفته ( مقدار بیش از ۲۵۵) و دوباره مقدار مربوطه از ۰ شروع شده است .

خروجی کد فوق :

طبیعتا این موضوع برای جمع دو ماتریس هم اندازه نیز صادق است:

در کد بالا m1 و m2 دو ماتریس به ترتیب به مقادیر :

هستند.که بعد از عملیات جمع این دو ماتریس دو درایه ی سطر دوم به دلیل سرریز مقادیر ۰ و ۱ را میگیرند.

خروجی کد:

برای حل این مشکل ( خراب نشدن عناصر بر اثر overflow ) راه حل هایی از جمله راه حل زیر وجود دارد :

در کد مشاهده شده ماتریس m1 را داریم که می خواهیم مقدار را به تمام درایه های آن بیفزاییم . براثر این عملیات مقادیری از ماتریس اصلی که بیشتر از ۱۵۰ یا مساوی ۱۵۰ هستند وقتی با ۱۰۰ جمع شوند سر ریز میشوند . برای جلوگیری از این موضوع میتوانیم درایه هایی که مقدارشان بیشتر یا مساوی ۱۵۰ هستند برابر با بیشترین مقدار ممکن یعنی ۲۵۵ قرار داده و عملیات جمع را برای بقیه ی درایه ها انجام دهیم .

خروجی کد:

 

حل مشکل با  OpenCV :

اگر از توابع cv2.add و cv2.subtract استفاده کنیم این مشکل را مشاهده نخواهیم کرد و مقادیر کمتر از ۰ همان ۰ و مقادیر بیش از ۲۵۵ همان ۲۵۵ باقی خواهد ماند.
به کد مقابل توجه کنید :

در این قطعه کد تصویری را خواندیم و سپس ماتریسی با اندازه ی تصویر خوانده شده ساختیم که تمام عناصرش ۱۰۰ هستند ، سپس این ماتریس را با تصویرمان جمع کردیم و چون ازتابع add در opencv استفاده کردیم خرابی در تصویر نهایی مشاهده نشد ، و به طور مشابه عمل subtract را انجام دادیم .

تصویر Orginal  :

orginal

تصویر Add شده :

تصویر Subtract شده :

 

مثال عملی ترکیب تصاویر رنگی :

در این مثال عملی مشاهده میشود که بعد از خواندن دو تصویر رنگی با نام های img1 و img2 ، این دو تصویر را با استفاده از تابع add جمع کردیم و در تصویر نهایی از دست رفتگی بعضی پیکسل ها را داریم       ( همانطور که در زیر مشاهده میکنید مثلا تصویر img2 برخی قسمت هایش از دست رفته است).

 img1 :                                                        img1  img2 :
img2

result :

حل این مشکل با ترکیب دو تصویر با جمع وزن‌دار :

برای حل این مشکل میتوانیم با نسبت های مختلف ، مثلا  ۰.۵ و ۰.۵ یا ۰.۳ و ۰.۷  و یا…. نسبت هایی که مشابها جمعشان  ۱ گردد تصاویر را جمع کنیم .

تابع مورد نظر به شکل زیر می باشد :

addWeighted(src1, alpha, src2, beta, gamma)

که آلفا و بتا در فرمول دوم مشاهده میشود.

g(x)=(1−α)f0(x)+αf1(x)
dst=α⋅img1+β⋅img2+γ

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

 

 img1 :                                                        img1  img2 :
img2

result :

 

عملیات بیتی (Bitwise Operations) و نقاب‌گذاری تصویر (Masking) :

ابتدا به رسم یک مربع و نیم دایره برای پیاده سازی عملیات بیتی روی اشکال میپردازیم.

همانطور که قابل مشاهده است ، در صفحه ای به اندازه ی ۳۰۰ در ۳۰۰ که تمام عناصر ماتریس آن صفر هستند ( صفحه ی تمام سیاه ) یک مربع سفید در وسط صفحه از مختصات (۵۰ ، ۵۰) تا (۲۵۰ ، ۲۵۰) رسم میکنیم ، سپس در صفحه ای مشابه به رسم نیم دایره میپردازیم.

تصاویر به این شکل خواهند بود :

عملیات بیتی تصویر در OpenCV :

حال به بررسی ۴ عملیات

  • bitwise_and
  • bitwise_or
  • bitwise_xor
  • bitwise_not

روی تصاویر خواهیم پرداخت :

عملیات bitwise_and :

در نتیجه ی عملیات and بین دو تصویر قسمت هایی که پیکسل در هر دوی آن تصاویر ۱  ( سفید ) است ، سفید ( مقدار 1 ) باقی خواهد ماند ، و بقیه ی پیکسل ها صفر ( سیاه ) خواهند بود و نتیجه به این شکل خواهد بود :

عملیات bitwise_or :

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

عملیات bitwise_xor :

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

عملیات bitwise_not :

این تابع نیز قسمت هایی از تصویر که بیت ۰ دارند ۱ میکند و بلعکس ( پیکسل های سیاه را سفید میکند و پیکسل های سفید را سیاه )

مثال عملی با تصویر رنگی :

اگر تصویر گاو اصلی را crop کنیم و سپس با این تصویر  and کنیم :

با توجه به اینکه میدانیم هر چیزی که با ۱ ، and شود ، حاصل خود آن میشود ، و هرچیزی که با ۰ ، and شود حاصل ۰ خواهد بود پس در نتیجه تصویر به این شکل در خواهد آمد :

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

برای درک عملگر بیتی دو تصویر به مثال زیر توجه کنید :

خروجی به شکل زیر خواهد بود :

نصب کتابخانه Keras بر پایه ی کتابخانه TensorFlow

سلام به همگی دوستان، سعی میکنم خیلی کوتاه و مختصر توضیح بدم تا وقت بیهوده برای خوندن مطلب از دست ندید.

اول از همه، برای یادآوری باید بگم که طبق تیتر مطلب، کتابخانه Keras (زین پس کراس) بر پایه ی کتابخانه های مختلفی نوشته شده که به دلیل تازه تر بودن، قوی تر بودن و همگانی تر شدن کتابخانه TensorFlow (زین پس تنسرفلو) ما قصد نصب برپایه این کتابخانه را داریم.

* برای شروع حتما نسخه 64 بیتی پایتون های 3.6 و یا 3.5 را نصب کنید. (آیا پایتون من 64 بیتی است؟)


نصب مبتنی بر CPU : 

نصب تنسرفلو به کمک Pip :

نصب تنسرفلو  به کمک Conda :

 

* مشکل در نصب : اگر با دستورات فوق موفق به نصب نشدید به این لینک رجوع کنید.

آیا تنسرفلوی من نصب شده است؟ برای اطمینان این کد را اجرا و از نصب درست کتابخانه مطمئن شوید.

نصب ابزار های مورد نیاز :

و در نهایت نصب کراس به کمک Pip :

نصب کراس به کمک Conda :

آیا کراس من نصب شده است؟ برای اطمینان این کد را اجرا و از نصب درست کتابخانه مطمئن شوید.

In :

Out :

 

 


نصب مبتنی بر GPU : 

برای اینکه بتونیم محاسبات رو با کارت گرافیک خودمون انجام بدیم نیاز به کارت گرافیک NVIDIA هست که در ادامه متوجه خواهید شد آیا شما می توانید از این روش استفاده کنید یا خیر!

 

نصب ابزار CUDA (پیش نیاز) :

کودا یک مدل برنامه نویسی و یک پلتفرم برای انجام محاسبات موازی می باشد.

برای شروع با طی کردن این مسیر از مدل کارت گرافیک خود آگاه بشوید :

Windows + R > control /name Microsoft.DeviceManager >  Display Adapters

سپس در این لیست جست و جو کنید، اگر نام سری و شماره پردازنده خود را یافتید شما قادر به استفاده از CUDA هستید!

سپس حتما نسخه 9.0 را دانلود و نصب نمایید و آدرس آن را در %PATH% قرار دهید. (لینک)

* مشکل در نصب : به این لینک مراجعه کنید.

نصب ابزار cuDNN (پیش نیاز) :

حتما نسخه 7.0 را دانلود و نصب نمایید و آدرس آن را در %PATH% قرار دهید. (لینک)

* توجه : حتما نسخه ذکر شده را نصب کنید و از وجود فایل cuDNN64_7.dll مطمئن شوید!

* مشکل در نصب : به این لینک مراجعه کنید.

نصب تنسرفلو به کمک Pip :

نصب تنسرفلو  به کمک Conda :

ما بقی مراحل همانند قسمت نصب با CPU می باشد. لطفا مشکلات و راه حل های خود را در گروه مطرح کنید تا به تکمیل تر شدن این پست کمک کنیم.

به زودی تکمیل می شود ..


محیط مجازی (virtualenv) : 

به طور خلاصه، برای جدا و ایزوله سازی وابستگی های یک پروژه از سایر پروژه ها از این قابلیت استفاده می شود. در ادامه به کمک این امکان، یک ورژن خاص از پایتون را بر روی محیط مجازی خودمون نصب می کنیم. (راه حلی برای نصب تنسرفلو از طریق کوندا بر روی پایتون 3.5 در حین داشتن ورژن 3.6)

* توجه : قبل از این عملیات ها، ورژن پایتون مورد استفاده خود را نصب نمایید.

نصب ابزار virtualenv :

ایجاد محیط جدید :

فعال کردن محیط در لینوکس :

 

فعال کردن محیط در ویندوز :

 

تبریک! حالا شما می تونید پکیج های مورد نظر خودتون رو در محیط ایجاد شده بدون ایجاد هیچگونه اختلالی در محیط های دیگر نصب نمایید.

برای deactive کردن، حذف و سایر اطلاعات مربوطه به این منبع مراجعه کنید.


  محیط مجازی در کوندا (virtualenv) : 

ایجاد محیط جدید :

فعال کردن محیط در لینوکس :

فعال کردن محیط در ویندوز :

حال می توانید پکیج های خود را بر روی محیط جدید نصب کنید.

نصب مستقیم پکیج در هنگام ساخت محیط جدید (راه دوم)

نصب ادیتور مخصوص محیط جدید

حال شما ادیتور لازم در کوندا و برای محیط جدید خودتون رو ایجاد و باز کرده اید

* توجه : در صورت عدم دسترسی cmd را در مود administrator باز کنید.

برای deactive کردن، حذف و سایر اطلاعات مربوطه به این منبع مراجعه کنید.

 


لینک منبع تنسرفلو : https://www.tensorflow.org/install/#pip_installation_on_windows

لینک منبع کراس : https://www.pyimagesearch.com/2016/11/14/installing-keras-with-tensorflow-backend/

 

دستکاری تصویر (3) – مثال‌های عملی در OpenCV

تبدیلات همگن (Affine Transform) 

انتقال (Translation) :

برای پیاده سازی این تبدیلات  از cv2.warpAffine استفاده میکینم.

به طور مثال در کد زیر :

پس از خواندن عکس  و دریافت عرض و طول تصویر:

یک نسبت دلخواه برای انتقال طول و عرض تصویر در نظر گرفتیم :

با استفاده از ضرب ماتریس انتقال در مختصات تصویر ،تصویر انتقال پیدا میکند :

از warpAffine برای تبدیل عکس استفاده میکنیم که ورودی های آن به صورت زیر است :

چرخاندن  (Rotations) :

*یادآوری

ماتریس دوران:

 

 

 

دوران در opencv

  • از نقص های این روش میتوان به ایجاد فضاهای سیاه اطراف تصویر اشاره کرد که در ادامه فضاهای سیاه ایجاد شده اطراف تصویر را با کراپ از بین میبریم.

روشی دیگر برای دوران :

ترانهاده ماتریس

ماتریس ترانهاده  با تغییر جای سطر ها با ستون ها باعث چرخش تصویر میشود و فضای سیاه اطراف تصویر ایجاد نمی کند .

flip  تصویر

تصویر را در جهت افق و خط عمود آینه می کند.

پارامتر دوم :

صفر یا false عکس را حول محور x  ها قرینه میکند.

یک یا True عکس را حول محور y ها قرینه میکند.

تغییر اندازه (scaling, resizing) و درون‌یابی (interpolations)

  • fx  و fy  پارامتر های  نام دار هستند میتوان آنها را به تابع پاس نداد.

روش های درون یابی :

  1.  Bilinear Interpolation (درج وابسته به ۴ پیکسل ۴ طرف)
  2.  Bicubic interpolation (درج وابسته به ۴ پیکسل ۴ طرف به علاوه ۴ پیکسل اریب)
  3.  Nearest Neighbor (نزدیکترین همسایه)

استفاده از ماتریس تبدیل

جهت هایی را که میخواهیم  scale شوند را در قطر ماتریس قرار میدهیم.

معایب :

  1. مشکل سیاهی تصویر را دارد.
  2. عکس بعد از اعمال interpolations باید crop شود .

Image Pyramids

در بعضی موارد، ما باید با تصاویری با وضوح مختلف تصویر مشابه کار کنیم. به عنوان مثال، هنگام جستجو برای چیزی در یک تصویر، مانند چهره، ما مطمئن نیستیم که کدام اندازه از شئ در تصویر وجود دارد.

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

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

Cropping

Opencv تابع مشخص برای کراپ کردن ندارد.

روش های جایگزین :

یکی از روش های کراپ کردن slicing است که با دادن بازه ی دقیقی از  x ,y (برای ساده تر شدن عکس را بصورت دو بعدی و سیاه سفید تصور میکنیم)همان بازه ی مشخص شده را کراپ می کنیم.

نکات :

مختصات شروع و پایان حتما  باید اعداد صحیح باشند.

در بازه نویسی به صورت   [ x1 : x2 , y1:y2 ] :

x1 شامل بازه میشود اما x2 نوشته نمیشود .

روش دیگر اسلایس کردن ماتریس  ها به کمک  numpy است.

مثال:

a=np.array([[100,200,400],[1,2,3]])

میخواهیم  عناصر سطر اول [0] و ستون دوم [1]  را انتخاب کنیم.

a [0: , 1:] => array([[200, 400],[ 2, 3]])

 

دستکاری تصویر (2) – دوران، انتقال، مقیاس و درون‌یابی

Rotation (دوران)

همانطور که در درس هندسه تحلیلی خوانده ایم برای چرخاندن نقطه ای به اندازه ی α خلاف جهت عقربه ساعت باید مختصات آن نقطه را در ماتریس چرخش ضرب کنیم.که نقطه دوران یافته به صورت زیر میباشد.

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

 

که آرگومان اول و دوم به ترتیب x و y مرکز دوران را میگیرند و آرگومان بعدی زاویه چرخش و آرگومان اخر آپشن اضافه ای در اختیار ما قرار داده است و عددی برای بزرگنمایی یا کوچک نمایی تصویر میگیرد و بدون درگیر کردن ما با ماتریس چرخش و سینوس و کسینوس این تبدیل را به خوبی انجام میدهد.=)

خروجی این تابع؛ ماتریس چرخش یا دوران می باشد.که میتوان با تابع پرینت آن را نمایش داد.

اما برای بدست آوردن تصویر دوران یافته کافیست از تابع زیر استفاده کرده و این ماتریس چرخش را به آن بدهیم و در خروجی این تابع عکس دوران یافته را بگیریم.

 

2D Translation (انتقال دوبعدی)

برای انتقال یک نقطه از مکانی به مکان دیگر از ماتریس زیر استفاده میکنیم:

که در اینجا:

x´ = x + Tx = 1 * x + 0 * y + Tx

y´ = y + Ty =  0 * x + 1 * y + Ty

و به این صورت میتوانیم تصویر را جابجا کنیم.

به صورت خلاصه تر این ماتریس به این صورت بیان میشود:

1 ها مقدار مقیاس گذاری را مشخص میکنند یعنی 1 خانه ی (0 و 0) نشان دهنده scale در راستای ایکس و 1 خانه ی (1 و 1) نشان دهنده scale  در راستای ایگرگ میباشد.که چون در اینجا مقادیر 1 هستند یعنی اندازه ی تصویر بدون تغییر میماند  و بزرگ نمایی یا کوچک نمایی انجام نمیشود.

تابعی که برای این کار در opencv در نظر گرفته اند بدین صورت است:

 

آرگومان اول تصویر میباشد و آرگومان دوم ماتریس انتقال و آرگومان اخر سایز عکس خروجی است.خروجی این تابع عکس انتقال یافته می باشد.

و خود ماتریس انتقال را میتوانیم بدین صورت بسازیم:

Np.float32([[1 , 0 , tx] , [0 , 1 , ty]])

Scalling (مقیاس گذاری)

ما اگر بخواهیم مثلا یک ماتریس 2 در 2 را به ماتریس 6 در 6 تبدیل کنیم یک سری نقاط(پیکسل) را نداریم.

با این 4 روش میخواهیم این نقاط را بسازیم.

  1.  Nearest Neighbor (نزدیکترین همسایه)
  2.  Bilinear Interpolation (درج وابسته به ۴ پیکسل ۴ طرف)
  3. Bicubic interpolation  (درج وابسته به ۴ پیکسل ۴ طرف به علاوه ۴ پیکسل اریب)
  4. استفاده از ماتریس تغییر شکل (با استفاده از تابع warpaffine با ارقام دلخواه و ترتیب گفته شده در ماتریس scalling، که در ابتدا آمده است)

این مقیاس گذاری دو حالت دارد:

  • بزرگ نمایی
  • کوچک نمایی

روش نزدیکترین همسایه(ساده ترین روش):

در این روش مثلا فلان پیکسل را نسبت می بندیم که آن روی یک پیکسل متناظرش در ماتریس جدید می افتد پس همان مقدار پیکسل را به آن میدهیم.سپس پیکسل دیگری را بررسی میکنیم که مثلا هیچ پیکسلی را متناظرش در ماتریس جدید نمی یابیم و در آن پیکسل مقدار نزدیکترین پیکسل را قرار می دهیم.

روش درج وابسته به۴ پیکسل ۴ طرف:نسبت به روش قبلی دقیقتر است.همانطور که مشخص است مقادیر 4 پیکسل اطراف را میانگین گرفته و پیکسل های خالی را پر میکنیم.

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

حال میخواهیم تابعی در opencvکه این کار را انجام میدهد بیان کنیم:

 

آرگومان اول تصویر مورد نظر است.آرگومان بعدی سایز عکس خروجی ست و دو آرگومان بعدی مقدار یا درصد مقیاس گذاری را مشخص میکند.(مثلا اگر عدد ۲ را به هردو آنها پاس دهیم یعنی میخواهیم تصویر در راستای طول و عرض ۲ برابر شود) و آرگومان اخر روش مقیاس گذاری(که در بالا توضیح دادیم) را تعیین میکند.خروجی این تابع نیز تصویر scale شده میباشد.

توجه:اگر هم اندازه تصویر خروجی را پاس دهیم هم مقادیر مقیاس گذاری؛ تابع اندازه را بر عدد یا درصد مقیاس ترجیح داده و آن را عملی میکند.

در آخر مقایسه انواع  روش های scaleرا باهم میبینیم:

دستکاری تصویر (1) – ماتریس‌های تبدیل

در جلسات قبل با مفهوم فضاهای رنگی آشنا شدیم و خواندیم که هر عکس رنگی از سه کانال رنگی (R,G,B) تشکیل شده است که هر کدام می توانند از صفر تا 255 مقدار بگیرند .

و اگر ما دستور image.shape  را برای یک عکس رنگی چاپ کنیم خروجی اینچنین خواهد بود

(height,width,3)

که عدد 3 نشان دهنده ی وجود هر سه کانال رنگی قرمز، سبز و آبی است اما اگر عکس را در حالت سایه و سفید (gray scale) ببریم خروجی دستور تنها طول و عرض عکس خواهد بود و دیگر تنها یک کانال رنگی وجود دارد که به صورت باینری است و صفر نشان دهنده ی نبود رنگ و 1 بیش ترین مقدار وجود رنگ را نشان میدهد(صفر نشان دهنده رنگ سیاه و یک نشان دهنده ی رنگ سفید است).

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

 

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

 

 

تا اینجای کار با مفاهیم اولیه ی open cv  آشنا شدیم اکنون میخواهیم وارد مبحت image manipulations بشیم که لازمه ای این مبحث این هستش که یه دوره ی سریعی روی مباحث جبر خطی که عمدتا در هندسه تحلیلی عنوان شده داشته باشیم .

انواع روش های image manipulations  یا دستکاری تصویر:

  • انتقال های همگن یا غیر همگن ( (Transformations, affine and non affine
  • تبدیلات (Translations)
  • Rotations (دوران)
  • Scaling, re-sizing and interpolations  ( درون یابی یا interpolations به معنای این است که در هنگام تغییر سایز عکس پیکسل هایی که خالی میماند را با چه الگوریتمی میخواهیم پر کنیم.)
  • Image Pyramids

انتقال

Transformations ها کلا تبدیلات ماتریسی هستند که عموما به صورت ضرب دو ماتریس هستند که ماتریس سومی را به عنوان خروجی میدهند و به دو نوع کلی همگن یا غیر همگن تقسیم میشوند.

تبدیلات همگن

تبدیل همگن یا تبدیل آفین یا transformation Affine نوعی تبدیل ریاضی است که خطی بودن و نسبت فاصله ها در آن حفظ می شود.(خطوطی که موازی بودند پس از تبدیل هم حتما موازی باقی میمانند اما طول و زاویه ی بین خطوط لزوما حفظ نمیشود).

بدین ترتیب در نتیجه یک تبدیل همگن، تمامی نقاط روی یک خط در ورودی، در خروجی نیز روی یک خط خواهند ماند.

  • انتقال، تجانس، تشابه و چرخش نمونه هایی از تبدیل های همگن هستند.

نکته هر تبدیل خطی همگن هست اما هر تبدیل همگنی خطی نیست.

 

معرفی وکتور

یک بردار یک بعدی است. که دو نوع دارد وکتور ستونی و سطری:

1)وکتور ستونی    2) وکتور سطری

برخی از ویژگی هایی که وکتور در ریاضیات دارد مانند جهت بردار ممکن است در مفاهیم برنامه نویسی صدق نکند اما همچنان میتوانیم از برخی ویژگی هایش مانند محاسبه نرم اقلیدسی استفاده کنیم.

نحوه محاسبه نرم اقلیدسی:

اگر دو وکتور به نام های A,B  داشته باشیم نرم اقلیدسی آن برابر است با

ماتریس

ماتریس همان بردار mxn است که در برنامه نویسی نیز همین معنا را دارد و یک عکس سیاه و سفید درواقع یک ماتریس  است که به میزان عرض عکس سطر و ارتفاع آن ستون دارد و هر درایه نمایانگر یک پیکسل است که میتواند ازصفر تا 255 مقدار بگیرد.

عکس رنگی نیز در واقع شامل سه ماتریس است که هر کدام از آنها مقدار یکی از کانالهای رنگی را نگه میدارد.

عملیات های ماتریسی در پایتون

جمع ماتریس ها با یکدیگر

جمع یک ماتریس با عدد ثابت

که در آن تک تک خانه های ماتریس با عدد جمع خواهند شد.

ضرب ماتریس در یک عدد ثابت یا scale

که در آن تک تک خانه های ماتریس در عدد ضرب خواهند شد.

 

نرم اقلیدسی در ماتریس ها

که دارای ویژگی های زیر است

  • مقدار آن همواره بزرگتر مساوی صفر است.
  • اگر صفر شود تک تک درایه های ماتریس باید صفر شوند .
  • به ازای هر
  • به ازای هر 

 

برای یاد آوری ضرب ماتریس ها میتوانید اینجا را کلیک کنید.

معرفی چند ماتریس خاص

ماتریس همانی:  یک ماتریس مربعی است کهتمامی درایه های روی قطر اصلی یک و سایر آنها صفر هستند.

ماتریس قطری: یک ماتریس مربعی است که درایه های روی قطر اصلی عدد دارند و سایر آنها صفر هستند.

ماتریس ترا نهاده: ماتریسی است که جای سطر و ستون هایش باهم عوض شده باشند.

ماتریس انتقال: ماتریسی است که برای انتقال بردار ها از طریق ضرب استفاده میشود.

نکاتی درباره ی ضرب ماتریس ها:

  • ضرب ماتریس ها خاصیت جابه جایی ندارد AB!=BA.
  • تنها میتوان ماتریس های مربعی را به توان رساند.

مقدمات OpenCV، خواندن و نمایش تصاویر، فضاهای رنگی

برای استفاده از پکیج opencv در برنامه خود باید عبارت  “import cv2” را در اول برنامه نوشته شود و همچنین برای استفاده از کتابخانه numpy دربرنامه خود باید عبارت  “import numpy as np” نوشته شود برای اینکه کلمه numpy کمی طولانی میباشد از کلمه np به جای آن استفاده میشود که کوتاه تر است . که با اضافه کردن as np  این کار صورت میگیرد.

برای اینکه از پکیج opencv استفاده شود باید cv2. نوشته شود و بعد آن توابعی را که از آن کتابخانه احتیاج داریم را بنویسیم .

برای اینکه از پکیج opencv استفاده شود باید cv2. نوشته شود و بعد آن توابعی را که از آن کتابخانه احتیاج داریم را بنویسیم .

برای load (بارگذاری)  یک عکس در برنامه باید از عبارت ()cv2.imread  استفاده کنیم که در پکیج opencv قراردارد.

در آرگومان اول باید آدرس کامل آن عکس که میخواهید بارگذاری شود را بدهید و دقت کنید که باید فرمت عکس هم نوشته شود که در مثال بالا عکس دارای فرمت jpg میباشد.

آرگومان دوم آن یک flag میباشد که راهی که عکس باید خوانده شود را تعیین میکند.

  • Cv2.IMREAD_COLOR : عکس رنگی را بارگذاری میکند.از شفافیت عکس غفلت خواهد شد. این یک flag پیش فرض میباشد.
  • Cv2.IMREAD_GRAYSCALE : عکس سیاه سفید را بارگذاری میکند.
  • Cv2.IMREAD_UNCHANGED :عکس را به صورتی که کانال alpha را داراست بارگذاری میکند.

میتوان به جای این سه flag از پاس دادن عدد 1 و 0 و 1- به ترتیب استفاده کرد.

برای مثال کد زیر را ببینید:

برای نمایش یک عکس در یک پنجره باید ازتابع ()cv2.imshow استفاده کرد که این پنجره به صورت اتوماتیک  با اندازه عکس متناسب میشود برای مثال:

آرگومان اول آن عنوانی است که در بالای پنجره ای که قرار است عکس را نمایش بدهد نشان داده میشود که این عنوان را باید داخل ‘  ‘ و یا “  “ بنویسید.

آرگومان دوم آن نام عکسی است که میخواهیم نمایش داده شود.

عبارت “cv2.waitKey”  یک تابع اجباری است که به ما اجازه میدهد تا زمانی که پنجره عکس باز است اطلاعات را دریافت کنیم.

آرگومان این تابع زمانی بر حسب میلی ثانیه میباشد که این تابع تا زمانی که تعیین شده منتظر میماند البته اگر شما تا آن زمان کلیدی را فشار دهید پنجره بسته خواهد شد.

اگر به این تابع 0 پاس دهید این تابع تا زمانی که کلیدی فشرده شود منتظر میماند.

تابع “cv2.destroyAllWindows” تمام پنجره های ساخته شده را خراب میکند که اگر یادتان برورد این عبارت را بنویسید برنامه شما هنگ میکند.

اگر شما بخواهید فقط یک پنجره مشخص را خراب کنید باید از تابع “cv2.destroyWindow”  استفاده کنید .

برای ذخیره کردن عکس در کامپیوتر خود باید ازتابع ()cv2.imwrite استفاده کرد که آرگومان اول آن نام فایل و آرگومان دوم آن عکسی است که میخواهید ذخیره شود برای مثال با نوشتن عبارت “cv2.imwrite(‘output.jpg’, input)” عکس input با اسم output و با فرمت jpg در کامپیوتر ذخیره میشود.

اگر با اجرای این خط کلمه true  چاپ شد یعنی این عکس با موفقیت ذخیره شده.

برای فهمیدن سایزعکس باید از “print (input.shape)” استفاده کنیم که عبارت print هر چه که در پرانتز از آن خواسته شده باشد را چاپ میکند که چون ما سایز عکس خود را میخواهیم باید input.shape را به آن پاس بدهیم. برای مثال این عبارت را چاپ میکند (600, 800, 3) که پارامتر اول آن ارتفاع عکس بر حسب پیکسل و دومی عرض عکس بر حسب پیکسل و سومی کانال های عکس میباشد که در اینجا کانال های عکس 3 میباشد به این معنی است که عکس رنگی میباشد یعنی سه کانال RGB را داراست و اگر کانال سوم 0 بود یعنی عکس سفید سیاه (grayscale) میباشد به صورت زیر:

 

تغییر فضای رنگی

در opencv بیشتر از 150 متد تبدیل فضای رنگی وجود دارد.

برای تبدیل کردن فضای رنگی از تابع “cv2.cvtcolor(input_image , flag)” استفاده میشود که flag نوع تبدیل را تعیین میکند.

برای تبدیل BGR به Gray از  فلگ “cv2.COLOR_BGR2GRAY”  استفاده میشود و همچنین برای تبدیل Gray به BGR از فلگ “cv2.COLOR_GRAY2BGR”  استفاده میشود.

 

یک فضای رنگی مفید دیگر HSV میباشد.

برای HSV رنج Hue برابر [0,179] و رنج  saturation برابر [0,255] و رنج Value برابر [0,255] میباشد.

برای تبدیل BGR به HSV از فلگ  “cv2.COLOR_BGR2HSV”  استفاده میشود.

با این تبدیل ما میتوانیم یک شی رنگی استخراج کنیم.در HSV فهمیدن یک رنگ خیلی آسون تر از فضای رنگی RGB میباشد.

تصویر زیر یک تصویر HSV میباشد.

تصویر زیر کانال Hue میباشد.

تصویر زیر کانال saturation میباشد.

تصویر زیر کانال Value میباشد.

دریافت از git و به روز کردن فایل‌ها

سورس‌کدهای مربوط به کلاس‌های این ترم در github آپلود میشود. در گیت‌هاب نمی‌توانید نوت‌بوک‌ها را یکی یکی دانلود کنید و هر بار باید کل نوت‌بوکها را بعد از هر بار به روز رسانی دریافت کنید که اینکار مطلوب نخواهد بود.

پیشنهاد میکنم برای رفع این مشکل از دستور العمل زیر استفاده کنید.


  • نصب نرم افزار git

ابتدا نرم افزار git را برای سیستم عامل خودتان دانلود و نصب کنید.
ابزارهای مختلفی برای اینکار وجود دارد، اگر از ویندوز استفاده می‌کنید میتوانید  از این آدرس دانلود کنید.



در فرآیند نصب میتوانید تمام گزینه های پیش فرض را انتخاب کنید. در عکس بالا و این قسمت از گزینه های نصب، گزینه‌ی use Git from windows command prompt را تیک بزنید.

حالا از این پس می‌توانید در محیط CMD از دستورات git استفاده کنید.

  • دریافت یک repository جدید (دستور clone)
  1. آدرس repository درس را از قسمت سبز سمت راست بالا ی  ( Clone or download) کپی کنید:
    مثلا آدرس برای درس بینایی ماشین آدرس https://github.com/Alireza-Akhavan/class.vision.git خواهد بود.
  2. به مسیری که میخواهید این repository را دریافت کنید بروید و با نگاه داشتن shift و زدن کلیک راست دکمه‌ی Open Command window here را بزنید.
  3. و در cmd ی که برای شما باز شده دستور زیر را وارد کنید:

    برای مثال برای repository مربوط به درس بینایی ماشین خواهیم داشت:

    و مطابق تصویر زیر پوشه حاوی repository گیت‌هاب بر روی سیستم شما کپی می‌شود.

    توصیه میکنم تا زمانی که با دستورات git آشنایی کامل پیدا نکرده اید بر روی این پوشه تغییراتی اعمال نکنید و آن را عینا کپی کرده و نوت‌بوکها را از نسخه‌ی کپی شده اجرا کرده و تغییر دهید.

 

  • به روز نگاه داشتن یک repository (دستور pull)

در طول ترم نوت‌بوکهای قبلی به روز شده و نوت‌بوکهای جدیدی اضافه خواهد شد، بدین منظور نیاز است به داخل پوشه‌ی مربوط به repository دریافت شده بروید (در اینجا class.vision) و با باز کردن cmd در این محل دستور زیر را تایپ کنید.

 

برای مثال خواهیم داشت:

 

موفق و سربلند باشید.

دانلود و نصب آناکوندا برای کار با پایتون

به آدرس https://www.continuum.io/downloads  بروید.

  1. نسخه‌ای که میخواهیم دانلود و نصب کنیم نسخه بالاتر یا برابر با Python 3.5 version است. لطفا ورژن پایین تر دانلود نکنید.
  2. برای دانلود نسخه ی مناسب, باید بدانید ویندوزتان 32 بیتی یا 64 بیتی است. اگر نمیدانید این لینک را مطالعه کنید:
    https://support.microsoft.com/en-us/help/15056/windows-7-32-64-bit-faq
  3. اگر از سیستم عامل ویندوز استفاده نمیکنید, به اینجانب  پیام بدهید و راهنمای نصب سیستم عامل  (Max، Linux) را دریافت کنید.

راهنمای دانلود برای ویندوز:

اگر سیستم عامل 32 بیتی دارید, روی لیک 32 بیتی و اگر 64 بیتی دارید روی لینک مربوطه کلیک کنید. (مطابق تصویر زیر)

راهنمای نصب:

  • روی فایل exe کلیک نمایید
  • مراحل را پیش بروید تا به تصویر زیر برسید؛ مطابق تصویر هر دو گزینه را تیک بزنید

توجه: (خود Anaconda توصیه کرده به علت احتمال تداخل PATH با نسخه های دیگر پایتون روی سیستمتان این گزینه را تیک نزنید. با این حال اگر دفعه اولی است که پایتون را نصب میکنید, برای سادگی توصیه میکنم این گزینه را تیک بزنید.)

– نصب در حود 15 دقیقه طول میکشد؛ در انتها روی دکمه ی finish کلیک نمایید.

 

راهنمای اجرا

راهنمای اجرای spyder :

از منوی start

آیکن مربوط به Anaconda Navigator

روی دکمه ی آبی رنگ (Launch) اجرای spyder کلیک کنید.

در نهایت محیط زیر را مشاهده خواهید کرد:

در سمت راست (2) کنسول و در سمت چپ (1) محیط کد نویسی را مشاهده میکنید که در کلاس تشریح شد.

 

راهنمای اجرای نوت‌بوکهای jupyter:

پوشه‌ی حاوی فایلهای .ipynb را که از گیت‌هاب درس دانلود کرده اید به مسیر دلخواه کپی کنید.

به این مسیر رفته و shift + کلیک راست کنید.

گزینه‌ی Open command window here را کلیک کنید.

در پنجره‌ی باز شده دستور jupyter notebook را تایپ کنید.

حال باید مرورگر شما باز شده و نوت‌بوکهای شما نشان داده شوند.

Installing OpenCV on a MAC

STEP 1 – Install Xcode

  1. Go to – https://developer.apple.com/xcode/
  2. Follow the installation instructions there, should be pretty straight forward to do.

STEP 2 – Install Homebrew

1.        Open the Terminal, by going to: Applications → Utilities → Terminal

2.       Type the following lines. Note do not type the red numbers, they are

simply line

3. Homebrew has now been successfully installed. We can run an update by doing:

brew install python 

STEP 3 – Install the Anaconda Python Package

1.       Go to: https://www.continuum.io/downloads

2.       Select the OSX installer (choose Python 3.5)

3.       Follow the Installation instructions, should be pretty standard, however Continuum has a guide here: https://docs.continuum.io/anaconda/install

4.       Anaconda which includes Python and lots of useful libraries is now installed.

STEP 4 – Install OpenCV 3.0.0

1. Go to terminal window and type the following:

2. Type the following lines:

3. That’s it, OpenCV 3.0.0 would have been successfully installed.

STEP 5 – Launch an Ipython Notebook and test.

1.       Go to terminal window and type the following: jupyter notebook

2.       Open a new ipython notebook. By clicking new located near the top right of the screen (see red 1 below) and then under Notebooks, click on Python 2 (see red 2 below).

3.       When out notebook file loads, type the 3 following lines of code as shown in the image below.

4. If successful, you should see the statement “Packages successfully imported” .

UPDATE:

If the above methods fail which has been happening to a lot of students due to changes in OpenCV, Anaconda etc. Please try the following alternative methods:

  1. From terminal type and run the following.

conda install -c https://conda.binstar.org/menpo opencv

مطالب مرتبط:

Install OpenCV 3 on macOS with Homebrew (the easy way)

Guide to troubleshooting Issues with Mac installs:

Resolving macOS, OpenCV, and Homebrew install errors

آموزش نصب OpenCV و شروع

گام اول – دانلود و نصب Anaconda Python Package

  • به آدرس  https://www.continuum.io/downloads  بروید.
  • نسخه مورد نظر را انتخاب کنید.توصیه میکنم برای این کلاس نسخه پایتون 3 به بالا را دانلود و نصب کنید.
  • آزمایش نصب – به windows command prompt یا CMD ویندوز بروید.
  • دستور زیر را تایپ کنید

jupyter notebook

برای اطلاعات بیشتر در مورد گام اول این پست را بخوانید.

گام دوم – نصب و اجرای OpenCV

  • به windows command prompt یا CMD ویندوز بروید.
  • دستورات زیر را به ترتیب وارد کنید ( باید به اینترنت متصل باشید.)

 

حال باید تمام سلولهای نوت‌بوک

00-Beginning.ipynb

بدون خطا اجرا شود. (برای اجرای نوت‌بوکها به قسمت راهنمای اجرای نوت‌بوکهای jupyter مراجعه کنید.