در بخش قبلی آموزش پردازش تصویر با نرم افزار OpenCV به آستانه یابی یا thresholding تصاویر پرداخیتم. در این بخش و یازدهمین قسمت از آموزش، به صاف کردن تصاویر در نرم افزار OpenCV میپردازیم.صاف کردن یا Smoothing به این معنی است که تصویری که وضوح خوبی ندارد یا دارای برش های تیز هستند را با فیلتر گذاری به نمایش بهتر آنها کمک کنیم. در ادامه آموزش پردازش تصویر OpenCV رزبری پای با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.
اهداف پردازش تصویر
در این مبحث از آموزش OpenCV با استفاده از فیلترگذاری های مختلف تصویرمان را تا نویز تصویر را گرفته و تصویری را تا حدودی نرم و صاف میکنیم و با فیلتر های مختلف دیگر نیز در این بخش آشنا خواهیم شد. این مبحث بدلیل بهبود بخشی تصاویر برای پردازش آنها بحث مهمی میباشد.
فیلتر تصویر ۲D Convolution
تصاویر میتوانند با عبور فیلتر های متفاوتی خواص جدیدی پیدا کنند به عنوان مثال فیلتر های low-pass filters (LPF) که برای حذف نویز و مات کردن تصویر به کار میرود ویا فیلتر های high-pass filters (HPF) که برای یافتن گوشه های تصویر به کار میرود، میتوان اشاره کرد. اپن سی وی در این زمینه برای ما تابع cv.filter2D() را ارائه میدهد که کارکرد آن به این صورت است که متوسط گیری روی تمام پیکسل های تصویر و اطراف آن انجام داده و پیکسل جدید را جایگزین میکند. تابع به شکل زیر در کد استفاده میشود:
dst = cv.filter2D( src, ddepth, kernel)
آرگومانها به این صورت خواهند بود:
src | تصویر ورودی |
dst | تصویر خروجی که هم سایز و هم کانال تصویر ورودی خواهد بود. |
ddepth | عمق مورد نظر که میتوانید مستندات را در وبسایت مربوطه مشاهد کنید و در صورت تعریف -۱ تصویر با عمق برابر تصویر ورودی ساخته خواهد شد. |
kernel | هسته همبستگی ، یک ماتریس نقطه شناور تک کاناله میباشد. در واقع یک ماتریک n*n که تقسیم بر n*n شده است. برای ساخت چنین ماتریسی میتوان از np.ones کمک گرفت. |
به عنوان مثال یک متوسط گیری روی ماتریس ۵ در ۵ پیکسلی اعمال میکنیم و نتیجه این خواهد شد که از ۲۵ پیکسل اطراف خود میانگین گرفته و این میانگیرن را روی پیکسل مرکزی اعمال میکند، این عمل روی تمامی پیکسل های تصویر اعمال خواهد شد. برای فهم این تابع به این کد دقت کنید:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('opencv_logo.png') kernel = np.ones((5,5),np.float32)/25 dst = cv.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Averaging') plt.xticks([]), plt.yticks([]) plt.show()
هموار سازی تصویر
برای هموار سازی یا صاف کردن تصاویر روش های مختلفی وجود دارد که در همگی آنها نویز و لبه های تصاویر تار خواهند شد و به اصطلاح تصویر ما صاف خواهد شد. همچنین روشهایی نیز وجود دارد که لبه های ما تار نشوند که به آنها اشاره خواهیم کرد. در ادامه با ما همراه باشید تا ۴ تکنیک اصلی این کار را به شما آموزش دهیم.
۱- متوسط گیری (Averaging)
این نوع فیلتر همانند بخش اول که توضیح داده شد عمل میکند یعنی با توجه به تعداد n*n پیکسل های اطراف متوسط گیری کرده و جایگزین پیکسل مرکزی میکند. دو تابع در این بخش معرفی میگردند که عبارتند از:
۱- dst = cv.blur( src, ksize)
آرگومان ها به این صورت خواهند بود:
src | تصویر ورودی که میتواند هر تعداد کانالی دارا باشد ولی عمق آن باید یکی از این این موارد باشد: CV_8U, CV_16U, CV_16S, CV_32F یا CV_64F |
dst | تصویر خروجی هم جنس و هم سایز تصویر ورودی |
ksize | سایز هسته n*n |
۲- dst = cv.boxFilter( src, ddepth, ksizer)
src | تصویر ورودی |
dst | تصویر خروجی هم جنس و هم سایز تصویر ورودی |
ddepth | عمق تصویر خروجی که با src.depth() تنظیم میشود و یا -۱ برای برابر شدن با تصویر ورودی |
ksize | سایز هسته |
هر دو این توابع به یک صورت عمل خواهند کرد برای درک بهتر استفاده به این مثال دقت کنید:
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('opencv-logo-white.png') blur = cv.blur(img,(5,5)) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Blurred') plt.xticks([]), plt.yticks([]) plt.show()
۲- تارکردن گاوسی (Gaussian Blurring)
در این روش بجای هسته ماتریسی از هسته گاوسی (نمایی) استفاده میکنیم. برای اینکار ما از تابع dst = cv.GaussianBlur( src, ksize, sigmaX) استفاده میکنیم که آرگومان های آن عبارتند از:
src | عکس ورودی |
dst | عکس خروجی هم جنس و سایز عکس ورودی |
ksize | اندازه هسته گاوسی |
sigmaX | انحراف استاندارد هسته گاوسی در جهت X (در جهت Y نیز برابر همین مقدار تعریف خواهد شد ولی بصورت جداگانه نیز میتوانید تعریف کنید) |
طول و عرض هسته گاوسی باید مثبت و فرد باشد همچنین در صورت مشخص نشدن sigmaX (مقدار ۰)، این مقدار از روی سایز هسته مشخص خواهد شد. این روش روی نویز بسیار کارآمد میباشد. به این مثال دقت کنید:
blur = cv.GaussianBlur(img,(5,5),0)
۳- تارکردن متوسط (Median Blurring)
در این روش مقدار متوسطی تحت یک هسته گرفته میشود و مقدار پیکسل مرکزی جایگزین میشود. این روش در بهبود نویز های به اصطلاح نمک و فلفلی بسیار موثر است. تابع مورد استفاده dst = cv.medianBlur( src, ksize) میباشد که آرگومان ها یه این صورت هستند:
src | تصویر ورودی که باید ۱ یا ۳ یا ۴ کاناله باشد و زمانی که سایز هسته ۳ یا ۵ است عمق های CV_8U، CV_16U ویا CV_32F قابل قبول هستند و در سایز های بزرگتر فقط CV_8U پذیرفته میشود. |
dst | تصویر خروجی هم جنس و سایز با تصویر ورودی |
ksize | اندازه خطی دیافراگم که باید عددی مثبت و فرد بزرگتر از ۱ باشد ، به عنوان مثال: ۳ ، ۵ ، ۷ و … |
به این مثال دقت کنید:
median = cv.medianBlur(img,5)
۴- فیلتر دو طرفه (Bilateral Filtering)
این روش در حذف نویز بسیار کارآمد است و لبه ها را تیز نگه میدارد ولی مشکل آن این است که کند تر از روش های پیشین میباشد. فیلتر گاوسی لبه ها را در نظر نمیگرفت در صورتی در پردازش تصویر لبه های تصویر برای ما اهمیت دارند و نمیخواهیم که با فیلتر تار شوند.
dst = cv.bilateralFilter( src, d, sigmaColor, sigmaSpace)
src | تصویر ورودی |
dst | تصویر خروجی |
d | قطر اطراف هر پیکسل که در طول فیلتر کردن استفاده می شود. اگر غیر مثبت باشد ، از sigmaSpace محاسبه می شود. |
sigmaColor | سیگما را در فضای رنگی فیلتر میکند. مقدار بزرگتر این پارامتر بدان معنی است که رنگهای دورتر در محله پیکسل با هم مخلوط می شوند و در نتیجه مناطق بزرگتر از رنگ نیمه برابر خواهد بود. |
sigmaSpace | سیگما را در فضای مختصات فیلتر میکند. مقدار بزرگتر پارامتر بدان معنی است که پیکسلهای دورتر تا زمانی که رنگهایشان به اندازه کافی نزدیک باشد بر یکدیگر تأثیر می گذارند. هنگامی که d>0 است اندازه محله را بدون توجه به sigmaSpace مشخص می کند. در غیر این صورت ، d متناسب با sigmaSpace است. |
به این مثال دقت کنید:
blur = cv.bilateralFilter(img,9,75,75)
همانطور که میبینید بافت تصویر از بین رفته ولی همچنان لبه ها حفظ شده اند. در این آموزش نحوه کار با فیلتر های مات کردن را آموزختیم؛ در آموزش بعدی به تغییرات مورفولوژیکی میپردازیم.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام خسته نباشید من برنامه open cv را نصب کردم ولی مجبور شدم سیستم عامل را فرمت کنم بعد از نصب رزبین دیگه open cv نصب نمیشه
چرا؟
با سلام و سپاس
لطفا از این آموزش استفاده فرمایید: آموزش نصب نرم افزار پردازش تصویر OpenCV برای پایتون روی برد رزبری پای
سلام
میشه لطفا راجبه فیلتر وینر و ایجاد نویز گوسی و فلفل نمکی هم توضیح بدید؟
ممنون میشم
سلام
فیلتر Wiener که فرمودید روشی برای بازگرداندن یک تصویر تار است که در آینده کامل تر بصورت پست توضیح داده خواهد شد.
درباره نویز گوسی و فلفل نمکی نیز میتوانید از لینک زیر اطلاعات بیشتری دریافت کنید:
https://stackoverflow.com/questions/14435632/impulse-gaussian-and-salt-and-pepper-noise-with-opencv
سلام
فیلتر Wiener که فرمودید روشی برای بازگرداندن یک تصویر تار است که در آینده کامل تر بصورت پست توضیح داده خواهد شد.
درباره نویز گوسی و فلفل نمکی نیز میتوانید از لینک زیر اطلاعات بیشتری دریافت کنید:
https://stackoverflow.com/questions/14435632/impulse-gaussian-and-salt-and-pepper-noise-with-opencv