0% found this document useful (0 votes)
14 views88 pages

I7 Koi

Iiuiooo

Uploaded by

lalepi5089
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views88 pages

I7 Koi

Iiuiooo

Uploaded by

lalepi5089
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 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