آموزش رزبری پای رزبری پای پایتون Python پردازش تصویر

آموزش پردازش تصویر OpenCV با برد رزبری پای – صاف کردن تصاویر

نوشته شده توسط آرش کدخدایی

در بخش‌ قبلی آموزش پردازش تصویر با نرم افزار 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)

همانطور که میبینید بافت تصویر از بین رفته ولی همچنان لبه ها حفظ شده اند. در این آموزش نحوه کار با فیلتر های مات کردن را آموزختیم؛ در آموزش بعدی به تغییرات مورفولوژیکی میپردازیم.

 

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

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

 

درباره نویسنده

آرش کدخدایی

یک تازه کار علاقه مند به تکنولوژی :)

تبادل نظر و رفع عیب با ثبت دیدگاه

۵ دیدگاه