You are on page 1of 88

‫درس ﯾﮑﻢ‪ :‬ﻣﻘﺪﻣﻪ و آﺷﻨﺎﯾﯽ اوﻟﯿﻪ ﺑﺎ اﻋﻤﺎل ﺗﻐﯿﯿﺮات ﺑﺮ روي ﺗﺼﻮﯾﺮ‬

‫‪1‬‬
‫فهرست مطالب‬

‫• معرفی موضوع و پیش‌نیازها‬

‫• نصب کتابخانه ‪OpenCV‬‬

‫• بارگذاری‪ ،‬نمایش و ذخیره تصاویر‬

‫• رسم متن و اشکال هندسی بر روی تصویر‬

‫• مثال تکمیلی‬

‫‪2‬‬
‫بخش یکم‬
‫معرفی موضوع و پیشنیازها‬

‫‪3‬‬
‫معرفی موضوع‬

‫• ‪Open Computer Vision Library‬‬

‫• مجموعه‌ای از کتابخانه‌های برنامه‌نویسی پردازش تصویر و یادگیری ماشین است‪.‬‬

‫م‌اکنون توسط ‪ Willow Garage‬و ‪ Itseez‬پشتیبانی می‌گردد‪.‬‬


‫• در ابتدا توسط اینتل ساخته و پشتیبانی می‌شد و ه ‌‬

‫• کتابخانه‌ای چندسکویی است و توسط سیستم عامل‌های ویندوز‪ ،‬لینوکس‪ iOS ،‬و اندروید پشتیبانی می‌شود‪.‬‬

‫• دارای رابط برنامه‌نویسی به زبان‌های ‪ Java ،Python ،C++ ،C‬و ‪ Matlab‬می‌باشد‪.‬‬

‫‪4‬‬
‫معرفی موضوع‬

‫• یک محیط یکپارچه توسعه نرم‌افزار همه‌منظوره‪ ،‬سطح باال‪ ،‬شیءگرا‪ ،‬اِسکریپتی و متن باز است‪.‬‬

‫• در سال ‪ ۱۹۹۱‬در کشور هلند طراحی شد‪.‬‬

‫• فلسفه ایجاد آن تأکید بر دو هدف اصلی خوانایی باالی برنامه‌های نوشته شده و کوتاهی و بازدهی نسبی باالی آن‬
‫است‪.‬‬

‫• کلمات کلیدی و اصلی این زبان به‌صورت حداقلی تهیه شده‌اند و در مقابل کتابخانه‌هایی‬
‫که در اختیار کاربر است بسیار وسیع هستند‪.‬‬

‫• سازمان‌های بزرگی که از پایتون استفاده می‌کنند‪ ،‬شامل گوگل‪ ،‬یاهو و ناسا هستند‪.‬‬

‫‪5‬‬
‫پیشنیازها‬

‫• آشنایی با زمینه‌های تئوری پردازش تصویر‪:‬‬


‫• آشنایی با انواع فیلترها‪ ،‬تبدیالت و‪ ...‬و نحوه عملکرد آن‌ها از بعد تئوری و ریاضی‬

‫• تجربه کاربری پایتون‪ ،‬شامل‪:‬‬


‫‪ ‬آشنایی با ‪ syntax‬زبان پایتون و کتابخانه‌های پرکاربرد آن‬

‫‪ matplotlib ،Numpy o‬و‪...‬‬


‫‪ ‬آشنایی با دیکشنری‌ها و متغیرهای رشته‌ای‬

‫‪ ‬آشنایی با حلقه‌ها و عملگرهای منطقی‬

‫‪6‬‬
‫بخش دوم‬
‫نصب کتابخانه ‪OpenCV‬‬

‫‪7‬‬
‫بخش سوم‬
‫بارگذاری‪ ،‬نمایش و ذخیره تصاویر‬

‫‪8‬‬
‫بارگذاری تصاویر‬

‫• تابع )(‪ cv2.imread‬به‌منظور خواندن تصاویر مورد استفاده قرار می‌گیرد‪ .‬این تابع دارای دو شناسه اصلی است‪.‬‬
‫‪ ‬شناسه اول‪ :‬مربوط به اسم و مسیر کامل عکس مورد‌نظر‪.‬‬

‫‪ ‬شناسه دوم‪ :‬مربوط به نوع خواندن تصویر‪.‬‬

‫• انواع خواندن تصاویر عبارتند از‬


‫‪ :cv2.IMREAD_COLOR ‬بارگذاری رنگی تصاویر‪.‬‬

‫‪ :cv2.IMREAD_GRAYSCALE ‬بارگذاری تصویر به حالت سیاه و سفید‪.‬‬

‫‪cv2.IMREAD_UNCHANGED ‬‬

‫نکته‪ :‬به‌جای استفاده از دستورات باال می‌توان به‌ترتیب اعداد ‪ 0 ،۱‬و ‪ -۱‬را وارد نمود‪.‬‬

‫‪9‬‬
‫نمایش تصاویر‬

‫• تابع )(‪ cv2.imshow‬به‌منظور نمایش تصاویر مورد استفاده قرار می‌گیرد‪ .‬این تابع دارای دو شناسه اصلی است‪.‬‬
‫‪ ‬شناسه اول‪ :‬نام پنجره تصویر که از نوع ‪ string‬خواهد بود‪.‬‬
‫‪ ‬شناسه دوم‪ :‬تصویر مورد‌نظر‪.‬‬

‫• برای تعیین تغییرپذیر بودن یا نبودن سایز پنجره تصویر از تابع )(‪ cv2.namedWindow‬استفاده می‌شود‪.‬‬
‫شناسه‌های این تابع عبارتند از‪:‬‬
‫‪ :cv2.WINDOW_AUTOSIZE ‬پیش‌فرض پنجره و اندازه غیرقابل تغییر‪.‬‬

‫‪ :cv2.WINDOW_NORMAL ‬پنجره با اندازه قابل تغییر‪.‬‬

‫‪10‬‬
‫ذخیره تصاویر‬

‫• تابع )(‪ cv2.imwrite‬به‌منظور ذخیره تصاویر مورد استفاده قرار می‌گیرد‪ .‬این تابع دارای دو شناسه اصلی است‪.‬‬
‫‪ ‬شناسه اول‪ :‬نام و فرمت فایل‪.‬‬

‫‪ ‬شناسه دوم‪ :‬تصویر مورد‌نظر‪.‬‬

‫‪11‬‬
‫بخش چهارم‬
‫رسم متن و اشکال هندسی بر روی تصاویر‬

‫‪12‬‬
‫توابع رسم در ‪OpenCV‬‬

‫• شناسه‌های مشترک توابع رسم‪:‬‬ ‫• توابع مورد استفاده در این بخش عبارتند از‪:‬‬
‫‪ ‬تصویر‬ ‫‪ ‬رسم خط‪cv2.line() :‬‬

‫‪ ‬رنگ‬ ‫‪ ‬رسم مستطیل‪cv2.rectangle() :‬‬

‫‪ ‬ضخامت‬ ‫‪ ‬رسم دایره‪cv2.circle() :‬‬

‫‪ ‬نوع خطوط‬ ‫‪ ‬رسم بیضی‪cv2.ellipse() :‬‬

‫‪ ‬رسم چندوجهی‪cv2.polylines() :‬‬

‫‪ ‬رسم متن‪cv2.putText() :‬‬

‫‪13‬‬
‫بخش پنجم‬
‫مثال تکمیلی‬

‫‪14‬‬
‫مثال تکمیلی‬

‫• مثال ‪ :۱‬تبدیل موشواره به قلم نقاشی‬

‫• مثال ‪ :2‬ساخت بوم نقاشی ساده (با دو قلم نقاشی)‬

‫‪15‬‬
‫فهرست مطالب‬

‫• خواندن و ویرایش پیکسل تصاویر‬

‫• کار با ناحیه تصویر (‪)ROI‬‬

‫• تفکیک و ادغام تصویر‬

‫• رسم حاشیه بر روی تصویر‬

‫• ترکیب تصاویر‬

‫‪2‬‬
‫بخش یکم‬
‫خواندن و ویرایش پیکسل تصاویر‬

‫‪3‬‬
‫خواندن و ویرایش پیکسل تصاویر‬

‫• دسترسی به مقدار پیکسل تصویر‪ ،‬با استفاده از مختصات سطر و ستون پیکسل مورد‌نظر امکان‌پذیر خواهد بود‪.‬‬
‫‪ ‬برای تصاویر رنگی (‪ ،)BGR‬آرایه‌ای از مقادیر رنگ‌های آبی‪ ،‬قرمز و سبز‪.‬‬
‫‪ ‬برای تصاویر سیاه و سفید‪ ،‬تنها شدت متناسب با پیکسل‪.‬‬

‫• دسترسی به خصوصیات تصویر‪ :‬شامل تعداد سطر و ستون‪ ،‬تعداد سطوح تصویر‪ ،‬تعداد پیکسل و‪...‬‬
‫• ‪ :img.shape‬بیان تعداد سطر‪ ،‬ستون و سطوح تصویر در قالب تاپل (‪.)tuple‬‬

‫• ‪ :img.dtype‬بیان نوع تصویر (‪ ،)datatype‬که به‌خصوص برای رفع خطاهای برنامه بسیار مهم و کاربردی است‪.‬‬

‫‪4‬‬
‫بخش دوم‬
‫کار با ناحیهای از تصویر (‪)ROI‬‬

‫‪5‬‬
‫کار با ناحیهای از تصویر (‪)ROI‬‬

‫• زمانی که ناحیه به‌خصوص از تصویر مورد‌نظر ماست‪(Region of Image) .‬‬

‫‪6‬‬
‫بخش سوم‬
‫تفکیک و ادغام تصویر‬

‫‪7‬‬
‫تفکیک و ادغام تصویر‬

‫• )(‪ :cv2.split‬هرزمان که نیاز باشد‪ ،‬می‌توان سطوح آبی‪،‬‬


‫قرمز و سبز تصویر را به سطوح تکی آن‌ها تفکیک نمود‪.‬‬

‫• )(‪ :cv2.merge‬همچنین می‌توان سطوح تفکیک شده را‬


‫با یکدیگر ادغام و تصویر رنگی را بازسازی کرد‪.‬‬

‫‪ ‬نکته‪ :‬تا حد ممکن بهتر است برای تفکیک و ادغام تصاویر‬


‫به‌جای دستورات باال از روش‌های ‪ numpy‬استفاده نمود‪.‬‬

‫‪8‬‬
‫بخش چهارم‬
‫رسم حاشیه بر روی تصویر‬

‫‪9‬‬
‫رسم حاشیه بر روی تصویر‬

‫• بدین منظور تابع )(‪ cv2.copyMakeBorder‬مورد استفاده قرار می‌گیرد‪.‬‬

‫• شناسه‌های این تابع عبارتند از‪:‬‬


‫• تصویر ورودی‬

‫• پهنای حاشیه در چهار جهت باال‪ ،‬پایین‪ ،‬راست و چپ‬

‫• نوع حاشیه‬

‫• رنگ حاشیه‬

‫‪10‬‬
‫رسم حاشیه بر روی تصویر‬

:‫ عبارتند از‬cv2.copyMakeBorder() ‫• انواع حاشیه‌های موجود در‬


cv2.BORDER_CONSTANT •

cv2.BORDER_REFLECT •

cv2.BORDER_REFLECT_101 •

cv2.BORDER_WRAP •

cv2.BORDER_REPLICATE •

11
‫بخش پنجم‬
‫ترکیب تصاویر‬

‫‪12‬‬
‫ترکیب تصاویر‬

‫• )(‪ :cv2.add‬ترکیب دو تصویر با عمق و نوع یکسان و با وزن یکسان‬

‫• )(‪ :cv2.addWeighted‬ترکیب دو تصویر با وزن (میزان تاثیرگذاری) متفاوت‬


‫𝑥 ‪g 𝑥 = 1 − 𝛼 𝑓0 𝑥 + 𝛼𝑓1‬‬ ‫• رابطه مورد استفاده در این تابع به شکل روبرو می‌باشد‪:‬‬

‫𝛾 ‪d𝑠𝑡 = 𝛼.𝑖𝑚𝑔1 + 𝛽.𝑖𝑚𝑔2 +‬‬ ‫• که‌در‌اینجا‌خواهیم‌داشت‪‌:‬‬

‫‪13‬‬
‫درس ﺳﻮم‪ :‬اﺑﺰارﻫﺎى رﯾﺎﺿﻰ در ‪OpenCV‬‬

‫‪1‬‬
‫فهرست مطالب‬

‫• تغییر فضای رنگی‬

‫• تعیین مقدار ‪ HSV‬تصویر‬

‫• اعمال آستانه بر روی تصویر‬

‫• تقسیم‌بندی ‪Otsu‬‬

‫• تبدیالت هندسی بر روی تصویر‬

‫‪2‬‬
‫بخش یکم‬
‫تغییر فضای رنگی‬

‫‪3‬‬
‫تغییر فضای رنگی‬

.‫ وجود دارد‬OpenCV ‫ روش تبدیل فضای رنگی در‬150 ‫• بیش از‬

:‫• ما تنها به دو تبدیل پرکاربرد اشاره خواهیم کرد‬


BGR Gray •

BGR HSV •

‫ نوع تبدیل را تعیین‬flag ‫ استفاده می‌شود که در‬cv2.cvtColor(input_image, flag) ‫• برای تبدیل رنگ از تابع‬
.‫می‌کند‬

• For BGR→Gray conversion we use the flags cv2.COLOR_BGR2GRAY

• Similarly for BGR→HSV, we use the flag cv2.COLOR_BGR2HSV


4
‫بخش دوم‬
‫تعیین مقدار ‪ HSV‬تصویر‬

‫‪5‬‬
‫تعیین مقدار ‪ HSV‬تصویر‬

‫• دامنه‌های‪ HSV‬عبارتند از‪:‬‬


‫• دامنه رنگ (‪[0,179] :)Hue range‬‬

‫• دامنه اشباع (‪[0,255]:)Saturation range‬‬

‫• دامنه مقدار (‪[0,255] :)Value range‬‬

‫• نرم‌افزارهای مختلف از مقیاس‌های متفاوت استفاده می‌نمایند‪ .‬در نتیجه برای تطبیق مقدار ‪ HSV‬در ‪OpenCV‬‬
‫باید این دامنه را نرماالیز نمود‪.‬‬

‫• برای تعیین مقدار ‪ HSV‬نیز از تابع )(‪ cv2.cvtColor‬استفاده می‌گردد‪.‬‬

‫‪6‬‬
‫بخش سوم‬
‫اعمال آستانه بر روی تصویر‬

‫‪7‬‬
‫اعمال آستانه بر روی تصویر‬

‫• تابع مورد استفاده در این بخش )(‪ cv2.threshold‬می‌باشد‪.‬‬

‫• اگر مقدار پیکسل بزرگتر از مقدار آستانه باشد‪ ،‬مقدار ‪ 1‬جایگزین آن می‌شود‪.‬‬

‫• این تابع دارای چهار شناسه اصلی است‪:‬‬


‫• شناسه اول‪ :‬تصویر اصلی (که می‌بایست تصویری سیاه و سفید باشد‪).‬‬

‫• شناسه دوم‪ :‬مقدار آستانه (که برای طبقه‌بندی مقادیر پیکسل‌ها مورد استفاده قرار می‌گیرد‪).‬‬

‫• شناسه سوم‪( maxVal :‬که نشان می‌دهد اگر مقدار پیکسل بیشتر (یا کمتر) از مقدار آستانه بود‪ ،‬چه مقداری اختصاص‬
‫یابد)‬

‫• شناسه چهارم‪ :‬سبک‌های مختلف آستانه را فراهم می نماید‪.‬‬


‫‪8‬‬
‫اعمال آستانه بر روی تصویر‬

:‫• سبک‌های مختلف آستانه عبارتند از‬

• cv2.THRESH_BINARY

• cv2.THRESH_BINARY_INV

• cv2.THRESH_TRUNC

• cv2.THRESH_TOZERO

• cv2.THRESH_TOZERO_INV

9
‫بخش چهارم‬
‫تقسیمبندی ‪Otsu‬‬

‫‪10‬‬
‫تقسیمبندی ‪Otsu‬‬

‫• تعیین مقدار آستانه به‌طور کلی‪ ،‬به‌صورت دلخواه انجام می‌گیرد‪.‬‬

‫• در این روش‪ ،‬برای اطمینان از مناسب بودن مقدار دلخواه‪ ،‬از آزمون و خطا استفاده می‌شود‪.‬‬

‫• تصویری را در نظر بگیرید که هیستوگرام آن دارای دو قله می‌باشد‪.‬‬

‫• در این حالت‪ ،‬کار ما برای تعیین مقدار آستانه مناسب‪ ،‬سخت‌تر خواهد بود‪.‬‬

‫• تقسیم‌بندی ‪ Otsu‬به‌طور اتوماتیک مقدار آستانه برای هیستوگرام تصاویر دارای دو قله را محاسبه می‌نماید‪.‬‬

‫• برای تصاویری که دوقله‌ای نباشند‪ ،‬این روش چندان دقیق نیست‪.‬‬

‫• برای استفاده از این روش از ‪ cv2.THRESH_OTSU‬استفاده می‌گردد‪.‬‬


‫‪11‬‬
‫بخش پنجم‬
‫تبدیالت هندسی بر روی تصویر‬

‫‪12‬‬
‫تبدیالت هندسی بر روی تصویر‬

‫• ‪ :Scaling‬تابع )(‪ cv2.resize‬مورد استفاده قرار می‌گیرد‪ .‬روش‌های درون‌یابی آن عبارتند از‪:‬‬
‫• ‪cv2.INTER_CUBIC‬‬

‫• ‪( cv2.INTER_LINEAR‬به‌طور پیش‌فرض برای تمام تغییر ابعادها مورد استفاده قرار می‌گیرد‪).‬‬

‫• ‪cv2.INTER_AREA‬‬

‫• ‪ :Translation‬توسط تابع )(‪ cv2.warpAffine‬محل مکان شیء (تصویر) را تغییر می‌دهد‪.‬‬

‫• نکته‪ :‬پارامتر سوم تابع مذکور‪ ،‬ابعاد تصویر خروجی می‌باشد که در آن عرض برابر با تعداد ستون و ارتفاع تعداد ردیف‬
‫تصویر می‌باشد‪.‬‬

‫‪13‬‬
‫تبدیالت هندسی بر روی تصویر‬

‫=𝑀‬ ‫𝜃𝑛𝑖𝑠‪𝑐𝑜𝑠𝜃 −‬‬


‫𝜃𝑠𝑜𝑐 𝜃𝑛𝑖𝑠‬
‫• ‪ :Rotation‬چرخش یک تصویر با زاویه 𝜃توسط ماتریس تبدیل روبرو به دست می‌آید‪:‬‬

‫• اما ‪ OpenCV‬چرخش مقیاس‌پذیر با مرکز چرخش قابل تنظیم را فراهم می‌کند‪ ،‬به‌طوری که می‌توان در هر مکان‬
‫که ترجیح می‌دهیم‪ ،‬چرخش را انجام دهیم‪.‬‬

‫=𝑀‬ ‫𝛽 𝛼‬
‫𝛼 𝛽‪−‬‬
‫𝑦‪1−𝛼 .𝑐𝑒𝑛𝑡𝑒𝑟.𝑥−𝛽.𝑐𝑒𝑛𝑡𝑒𝑟.‬‬
‫𝑦‪𝛽.𝑐𝑒𝑛𝑡𝑒𝑟.𝑥+ 1−𝛼 .𝑐𝑒𝑛𝑡𝑒𝑟.‬‬
‫• ماتریس تبدیل تغییر یافته به شکل روبه‌رو تعریف می‌شود‪:‬‬

‫که در آن 𝜃𝑠𝑜𝑐‪ 𝛼 = 𝑠𝑐𝑎𝑙𝑒.‬و 𝜃𝑛𝑖𝑠‪𝛽 = 𝑠𝑐𝑎𝑙𝑒.‬‬

‫تابع مورد استفاده در این قسمت ‪ cv2.getRotationMatrix2D‬می‌باشد‪.‬‬

‫‪14‬‬
‫تبدیالت هندسی بر روی تصویر‬

‫• ‪ :Affine Transformation‬نوعی تبدیل ریاضی است که هم‌خطی‌بودن و نسبت فاصله‌ها در آن حفظ می‌شود‪.‬‬

‫• در این تبدیل‪ ،‬تمام خطوط موازی در تصویر اصلی‪ ،‬موازی باقی می‌مانند‪.‬‬

‫• برای یافتن ماتریس انتقال‪ ،‬به سه نقطه از تصویر ورودی و سه نقطه متناظر‬
‫در تصویر خروجی نیاز داریم‪.‬‬

‫• تابع ‪ cv2.getAffineTransform‬یک ماتریس ‪ 2‬در ‪ 3‬ایجاد می‌کند‪.‬‬

‫• تبدیل نهایی توسط تابع ‪ cv2.warpAffine‬اتفاق می‌افتد‪.‬‬

‫‪15‬‬
‫تبدیالت هندسی بر روی تصویر‬

‫• ‪ :Perspective Transformation‬در این تبدیل به ماتریس ‪ 3‬در ‪ 3‬نیاز داریم‪.‬‬

‫• برای یافتن این ماتریس ‪ 4‬نقطه در تصویر ورودی و ‪ 4‬نقطه متناظر در تصویر خروجی که سه نقطه از آن‌ها نباید در‬
‫یک خط باشند مورد‌نیاز است‪.‬‬

‫• توابع مورد استفاده در این قسمت عبارتند از‪:‬‬


‫• ماتریس تبدیل ‪cv2.getPerspectiveTransform‬‬

‫• تابع تبدیل ‪cv2.warpPerspective‬‬

‫‪16‬‬
‫درس ﭼﻬﺎرم‪ :‬آﺷﻨﺎﯾﻰ و اﻋﻤﺎل اﻧﻮاع ﻓﯿﻠﺘﺮﻫﺎ ﺑﺮ ﺗﺼﺎوﯾﺮ‬

‫‪1‬‬
‫فهرست مطالب‬

‫• ماتریس فیلتر تصویر‬

‫• فیلتر میانگین‬

‫• فیلتر گوسی‬

‫• فیلتر میانه‬

‫• فیلتر دوطرفه‬

‫‪2‬‬
‫بخش یکم‬
‫ماتریس فیلتر تصویر‬

‫‪3‬‬
‫ماتریس فیلتر تصویر‬
‫• اعمال فیلتر روی تصویر‪:‬‬
‫• فیلتر پایین گذر (‪ :)LPF‬جهت حذف نویز‬

‫• فیلتر باالگذر (‪ :)HPF‬یافتن لبهها‬

‫• تابع )(‪ :cv2.filter2D‬ساخت و اعمال هسته به تصویر‬


‫• مثال‪ :‬امتحان یک فیلتر میانگینگیری روی یک تصویر‬

‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬


‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬
‫=𝐾‬
‫‪25‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫• یک هسته فیلتر میانگین ‪ 5×5‬را میتوان بهصورت روبرو تعریف کرد‪:‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪1‬‬

‫‪4‬‬
‫بخش دوم‬
‫فیلتر میانگین‬

‫‪5‬‬
‫فیلتر میانگین‬

‫• در این روش‪ ،‬میانگین تمام پیکسلهای زیر ناحیه هسته محاسبه شده و عنصر مرکزی با این میانگین جایگزین‬
‫میشود‪.‬‬

‫• فیلتر میانگین توسط تابع )(‪ cv2.blur‬و یا )(‪ cv2.boxFilter‬انجام میگیرد‪.‬‬

‫• عرض و ارتفاع هسته را باید مشخص کرده و آن را نرماالیز نماییم‪.‬‬


‫‪1 1 1 1‬‬ ‫• برای مثال یک ماتریس هسته نرمال شده با عرض و ارتفاع ‪ 3‬به شکل روبرو خواهد بود‪:‬‬
‫‪𝐾= 1 1 1‬‬
‫‪9‬‬
‫‪1 1 1‬‬

‫• نکته‪ :‬اگر نرماالیز شده ماتریس هسته موردنظر ما نباشد‪ ،‬میتوان شناسه نرماالیز را در تابع )(‪ cv2.boxFilter‬به‬
‫شکل روبرو غیر فعال نمود‪normalize=False :‬‬
‫‪6‬‬
‫بخش سوم‬
‫فیلتر گوسی‬

‫‪7‬‬
‫فیلتر گوسی‬

‫• این فیلتر توسط تابع )(‪ cv2.GaussianBlur‬به تصویر اعمال میشود‪.‬‬

‫• عرض و ارتفاع هسته به شکل اعدادی مثبت و فرد تعیین گردد‪.‬‬

‫• همچنین انحراف معیار درجهت ‪ X‬و ‪ Y‬که به ترتیب با 𝑋𝜎 و 𝑌𝜎 نشان داده میشود نیز باید مشخص گردد‪.‬‬

‫• اگر تنها 𝑋𝜎 مشخص گردد‪ 𝜎𝑌 ،‬برابر با 𝑋𝜎 خواهد بود و اگر هردو صفر باشد‪ ،‬از اندازه هسته محاسبه میشود‪.‬‬

‫• فیلتر گاوسی در برداشتن نویز گاوسی از تصویر بسیار موثر است‪.‬‬

‫توسط تابع )(‪ cv2.getGaussianKernel‬نیز ایجاد نمود‪.‬‬ ‫• هسته گوسی را میتوان‬

‫‪8‬‬
‫بخش چهارم‬
‫فیلتر میانه‬

‫‪9‬‬
‫فیلتر میانه‬

‫• تابع )(‪ cv2.medianBlur‬میانه تمام پیکسلها در پنجره هسته را محاسبه میکند و پیکسل مرکزی با این مقدار‬
‫میانه جایگزین میشود‪.‬‬

‫• فیلتر میانه در حذف نویز نمک و فلفل بسیار موثر است‪.‬‬

‫• در فیلتر میانه‪ ،‬پیکسل مرکزی حتما با یکی از مقادیر پیکسلها جایگزین میشود‪.‬‬

‫• اندازه هسته باید یک عدد صحیح مثبت و فرد باشد‪.‬‬

‫‪10‬‬
‫بخش پنجم‬
‫فیلتر دوطرفه‬

‫‪11‬‬
‫فهرست مطالب‬

Erosion ‫• فرسایش یا‬

Dilation ‫• انبساط یا‬

Opening & Closing •

Morphological Gradient & TopHat & Black Hat •

‫• المان ساختاری‬

2
‫بخش یکم‬
‫فرسایش یا ‪Erosion‬‬

‫‪3‬‬
‫فرسایش یا ‪Erosion‬‬

‫• ایده اولیه فرسایش درست مانند فرسایش خاک است و مرزهای جسم پیشزمینه را از بین میبرد‪.‬‬

‫• یک پیکسل در تصویر اصلی (‪ ۱‬یا ‪ )۰‬تنها در صورتی باقی خواهد ماند که تمام پیکسلهای زیر هسته ‪ ۱‬باشد و در‬
‫غیر این صورت فرسوده میشود‪( .‬تبدیل به صفر میشود)‪.‬‬

‫• بنابراین تمام پیکسلهای نزدیک به مرز (بسته به اندازه هسته) دور ریخته میشوند‪.‬‬

‫• در نتیجه ضخامت یا اندازه شیء پیشزمینه کاهش مییابد و به عبارت سادهتر‪ ،‬منطقه سفید در تصویر کاهش‬
‫مییابد‪.‬‬

‫• عمل فرسایش توسط تابع )(‪ cv2.erode‬انجام میگیرد‪.‬‬

‫‪4‬‬
‫بخش دوم‬
‫انبساط یا ‪Dilation‬‬

‫‪5‬‬
‫انبساط یا ‪Dilation‬‬

‫• این عملگر درست نقطه مقابل فرسایش است‪.‬‬

‫• در اینجا یک عنصر پیکسل ‪ ۱‬است‪ ،‬اگر حداقل یک پیکسل در زیر ‪ ۱‬باشد‪.‬‬

‫• بنابراین منطقه سفید را در تصویر افزایش میدهد و یا حجم پیشزمینه افزایش مییابد‪.‬‬

‫• در اتصال قطعات شکسته یک شیء مفید است‪.‬‬

‫• عمل انبساط توسط تابع )(‪ cv2.dilate‬انجام میگیرد‪.‬‬

‫‪6‬‬
‫بخش سوم‬
Opening & Closing

7
‫‪Opening & Closing‬‬

‫• ‪ Opening‬درواقع نام دیگری از فرسایش است که پس از آن انبساط ایجاد میشود‪.‬‬

‫• این عملگر در حذف نویز مفید است‪.‬‬

‫• در اینجا از تابع )(‪ cv2.morphologyEx‬استفاده میگردد‪.‬‬

‫• ‪ Closing‬دقیقا معکوس ‪ Opening‬بوده و بعد از آن فرسایش رخ میدهد‪.‬‬

‫• این عملگر در در حذف حفرههای کوچک در داخل تصویر پیشزمینه یا نقاط کوچک سیاه روی تصویر مفید است‪.‬‬

‫• در اینجا نیز از تابع )(‪ cv2.morphologyEx‬استفاده میگردد‪.‬‬

‫‪8‬‬
‫بخش چهارم‬
Morphological Gradient & TopHat & Black Hat

9
‫‪Morphological Gradient & Top Hat & Black Hat‬‬

‫• ‪ :Morphological Gradient‬تفاضل بین فرسایش و انبساط بر روی تصویر است‪.‬‬

‫• بدین منظور از شناسه ‪ cv2.MORPH_GRADIENT‬در تابع )(‪ cv2.morphologyEx‬استفاده میشود‪.‬‬

‫• ‪ :TopHat‬تفاضل بین تصویر ورودی و اعمال ‪ Opening‬بر تصویر است‪.‬‬

‫• بدین منظور از شناسه ‪ cv2.MORPH_TOPHAT‬در تابع )(‪ cv2.morphologyEx‬استفاده میشود‪.‬‬

‫• ‪ :Black Hat‬تفاضل بین تصویر ورودی و اعمال ‪ Closing‬بر تصویر است‪.‬‬

‫• بدین منظور از شناسه ‪ cv2.MORPH_BLACKHAT‬در تابع )(‪ cv2.morphologyEx‬استفاده میشود‪.‬‬

‫‪10‬‬
‫بخش پنجم‬
‫المان ساختاری‬

‫‪11‬‬
‫المان ساختاری‬

‫• المان ساختاری در مثالهای قبلی بهصورت دستی و به شکل مستطیل ایجاد شد‪.‬‬

‫• اما در بعضی موارد ممکن است نیاز به هسته بیضوی یا دایرهای داشته باشیم‪.‬‬

‫• تابع )(‪ cv2.getStructuringElement‬با دریافت شکل و اندازه‪ ،‬هسته را به شما تحویل میدهد‪.‬‬

‫• شناسههای تابع عبارتند از‪:‬‬


‫• شناسه ‪cv2.MORPH_RECT‬‬

‫• شناسه ‪cv2.MORPH_ELLIPSE‬‬

‫• شناسه ‪cv2.MORPH_CROSS‬‬

‫‪12‬‬
‫فهرست مطالب‬

‫• مشتقات ‪Sobel and Scharr‬‬

‫• الپالسین‬

‫• تشخیص لبه ‪Canny‬‬

‫‪2‬‬
‫بخش یکم‬
Sobel and Scharr ‫مشتقات‬

3
‫مشتقات ‪Sobel and Scharr‬‬
‫• عملگرهای سوبل از جمله فیلترهای تشخیص لبه می‌باشد‪.‬‬

‫• جهت مشتقات را می‌توان با شناسه‌های ‪ yorder‬و ‪ xorder‬به شکل عمودی و یا افقی تعریف نمود‪.‬‬

‫• برای محاسبه مشتق در جهت ‪ xorder=1 ،x‬و ‪ yorder=0‬خواهد بود‪.‬‬

‫• اندازه هسته با شناسه ‪ ksize‬تعریف می‌شود‪.‬‬

‫• اگر ‪ ksize=1‬باشد‪ ،‬یک فیلتر ‪ 3×3 Scharr‬استفاده می‌شود که نتایج بهتری از فیلتر ‪ 3×3 Sobel‬دارد‪.‬‬

‫• تابع )(‪ cv2.Sobel‬بدین منظور مورد استفاده قرار می‌گیرد‪.‬‬

‫‪4‬‬
‫بخش دوم‬
‫الپالسین‬

‫‪5‬‬
‫الپالسین‬

‫• تابع )(‪ cv2.Laplacian‬برای محاسبه الپالسین تصویر به کار می‌رود‪.‬‬

‫• اگر ‪ ksize=1‬باشد‪ ،‬هسته زیر برای فیلتر تصویر مورد استفاده قرار می‌گیرد‪:‬‬

‫‪0 1‬‬ ‫‪0‬‬


‫‪𝑘𝑒𝑟𝑛𝑒𝑙 = 1 − 4‬‬ ‫‪1‬‬
‫‪0 1‬‬ ‫‪0‬‬
‫از آنجایی که الپالسین مشتق دوم می‌باشد‪ ،‬میزان تغییرات در نواحی مختلف تصویر را با حساسیت بیشتر از سوبل‬
‫نشان می‌دهد‪.‬‬

‫الپالسین در واقع مشتق مرتبه دوم در راستای ‪ x‬به عالوه مشتق مرتبه دوم در راستای ‪ y‬می‌باشد‪.‬‬

‫‪6‬‬
‫بخش سوم‬
‫تشخیص لبه ‪Canny‬‬

‫‪7‬‬
‫تشخیص لبه ‪Canny‬‬

‫• این نظریه‪ ،‬یک الگوریتم تشخیص لبه محبوب است‪.‬‬

‫• این الگوریتم چند مرحله‌ای‪ ،‬در سال ‪ 1986‬توسط ‪ John F. Canny‬ایجاد شد‪.‬‬

‫• مراحل این الگوریتم عبارتند از‪:‬‬


‫‪ -1‬کاهش نویز‬

‫‪ -2‬یافتن شدت گرادیان تصویر‬

‫‪ -3‬حذف بدون بیشینه‬

‫‪Hysteresis Thresholding -4‬‬

‫‪8‬‬
‫تشخیص لبه ‪Canny‬‬

‫‪ -1‬کاهش نویز‪ :‬از آنجا که تشخیص لبه حساس به نویز در تصویر است‪ ،‬اولین گام‪ ،‬حذف نویز با یک فیلتر گوسی ‪5×5‬‬
‫است‪.‬‬

‫‪ -2‬یافتن شدت گرادیان تصویر‪ :‬شیب و جهت لبه برای هر پیکسل با اعمال فیلتر سوبل در هردو جهت افقی و عمودی‬
‫حاصل می‌شود‪ .‬جهت گرادیان همیشه بر لبه‌ها عمود است‪.‬‬

‫‪ -3‬حذف بدون بیشینه‪ :‬بعد از گرفتن اندازه و جهت شیب‪ ،‬برای حذف هر پیکسل ناخواسته که ممکن است لبه را‬
‫تشکیل دهد‪ ،‬اسکن انجام می‌شود‪.‬‬

‫‪ :Hysteresis Thresholding -4‬این مرحله تصمیم می‌گیرد کدام لبه‌ها به راستی لبه هستند‪.‬‬

‫‪9‬‬
‫تشخیص لبه ‪Canny‬‬

‫• تمام مراحل بیان شده‪ ،‬توسط تابع )(‪ cv2.Canny‬اجرا می‌شود‪.‬‬

‫• شناسه‌های اصلی این تابع عبارتند از‪:‬‬

‫• تصویر ورودی‬
‫• ‪minVal‬‬

‫• ‪maxVal‬‬

‫‪Edge_Gradient(G)= 𝐺𝑥2 + 𝐺𝑦2‬‬ ‫‪True‬‬ ‫• اندازه دیافراگم (به‌طور پیش‌فرض برابر با ‪ 3‬است)‬

‫𝑦𝐺 ‪Edge_Gradient(G)= 𝐺𝑥 +‬‬ ‫‪False‬‬ ‫• ‪L2gradient‬‬

‫‪10‬‬
‫فهرست مطالب‬

‫• رسم هیستوگرام‬

‫• هموارسازی هیستوگرام‬

‫• تعادلسازی هیستوگرام تطبیقی کنتراست محدود‬

‫‪2‬‬
‫بخش یکم‬
‫رسم هیستوگرام‬

‫‪3‬‬
‫رسم هیستوگرام‬
‫• هیستوگرام نموداری است که ایده کلی در مورد توزیع شدت یک تصویر ارائه می‌دهد‪.‬‬

‫• در این نمودار معموال مقادیر پیکسل از ‪ 0‬تا ‪ 255‬در محور ‪ x‬و تعداد نقاط متناظر در تصویر روی محور ‪ y‬قرار دارد‪.‬‬

‫• روشی برای درک تصویر است‪.‬‬

‫• با نگاه کردن به هیستوگرام یک تصویر‪،‬‬

‫اطالعات کنتراست‪ ،‬روشنایی‪ ،‬توزیع شدت و‪...‬‬

‫تصویر را درمی‌یابیم‪.‬‬

‫‪4‬‬
‫رسم هیستوگرام‬
‫• برای یافتن هیستوگرام تصویر از تابع )(‪ cv2.calcHist‬استفاده می‌نماییم‪.‬‬

‫• شناسه‌های این تابع عبارتند از‪:‬‬


‫• تصویر ورودی‪ :‬از نوع ‪ uint8‬یا ‪ float32‬که می‌بایست داخل براکت قرار گیرد‪.‬‬

‫• کانال‌ها‪ :‬برای تصویر ورودی سیاه و سفید‪ ،‬مقدار ]‪ [0‬و برای تصاویر رنگی مقادیر ]‪ [1] ،[0‬و ]‪ [2‬برای محاسبه هیستوگرام‬
‫کانال‌های آبی‪ ،‬سبز و یا قرمز مورد استفاده قرار می‌گیرد‪.‬‬

‫• ماسک‪ :‬برای محاسبه هیستوگرام کل تصویر ‪ None‬خواهد بود‪.‬‬

‫• تعداد پیکسل‪ :‬می‌بایست درون براکت قرار گیرد‪.‬‬

‫• بازه‪ :‬معموال بین‪ 0‬و ‪ 256‬می‌باشد‪.‬‬

‫‪5‬‬
‫بخش دوم‬
‫هموارسازی هیستوگرام‬

‫‪6‬‬
‫هموارسازی هیستوگرام‬

‫• تصویری را در نظر بگیرید که مقادیر پیکسل آن‪ ،‬به ناحیه خاصی از تصویر محدود است‪.‬‬

‫• برای مثال‪ ،‬در یک تصویر روشن‪ ،‬تمام پیکسل‌ها محدود به مقادیر باال خواهد شد‪.‬‬

‫• اما یک تصویر خوب‪ ،‬پیکسل‌هایی از تمام نواحی تصویر خواهد داشت‪.‬‬

‫• پس باید هیستوگرام را به هر دو انتها ببریم‪.‬‬

‫• این همان کاری است که هموارسازی هیستوگرام‬

‫انجام خواهد داد و موجب بهبود کنتراست خواهد شد‪.‬‬

‫تابع مورد استفاده )(‪ cv2.equalizeHist‬می باشد‪.‬‬

‫‪7‬‬
‫بخش سوم‬
‫تعادلسازی هیستوگرام تطبیقی کنتراست محدود‬

‫‪8‬‬
‫تعادلسازی هیستوگرام تطبیقی کنتراست محدود‬

‫• )‪CLAHE (Contrast Limited Adaptive Histogram Equalization‬‬

‫• در هموارسازی هیستوگرام قبلی‪ ،‬کنتراست تمام تصویر در نظر گرفته شد‪.‬‬

‫• این نوع هموارسازی برای تمام تصاویر مناسب نیست!‬

‫‪9‬‬
‫تعادل سازی هیستوگرام تطبیقی کنتراست محدود‬

‫• در این روش تصویر به قطعات کوچکتری به نام ‪ tiles‬تقسیم می‌شود که به‌صورت پیش‌فرض ‪ 8×8‬می‌باشد‪.‬‬

‫• سپس تعادل‌سازی یا هموارسازی هیستوگرام برای هر قطعه کوچک تصویر صورت می‌گیرد‪.‬‬

‫• توابع مورد استفاده در این روش )(‪cv2.createCLAHE‬‬

‫و )(‪ clahe.apply‬می‌باشد‪.‬‬

‫‪10‬‬
‫فهرست مطالب‬

‫• تطبیق یک شیء در تصویر‬

‫• تطبیق چند شیء در تصویر‬

‫‪2‬‬
‫بخش یکم‬
‫تطبیق یک شیء در تصویر‬

‫‪3‬‬
‫تطبیق یک شیء در تصویر‬
‫• تطبیق الگو‪ ،‬روشی برای جستجو و یافتن تصویر الگو در یک تصویر بزرگتر است‪.‬‬

‫• بدین منظور تابع )(‪ cv2.matchTemplate‬مورد استفاده قرار می‌گیرد‪.‬‬

‫• روش‌های موجود در این تابع عبارتند از‪:‬‬


‫• ‪cv2.TM_CCOEFF‬‬

‫• ‪cv2.TM_CCOEFF_NORMED‬‬

‫• ‪cv2.TM_CCORR‬‬

‫• ‪cv2.TM_CCORR_NORMED‬‬

‫• ‪cv2.TM_SQDIFF‬‬

‫• ‪cv2.TM_SQDIFF_NORMED‬‬
‫‪4‬‬
‫بخش دوم‬
‫تطبیق چند شیء در تصویر‬

‫‪5‬‬
‫تطبیق چند شیء در تصویر‬

‫‪6‬‬

You might also like