در بخش قبلی آموزش پردازش تصویر با نرم افزار OpenCV به عملیات پایه روی تصاویر پرداختیم. در این بخش و ششمین قسمت از آموزش به عملیات محاسباتی تصاویر با ترکیب تصاویر در نرم افزار OpenCV میپردازیم. در ادامه آموزش پردازش تصویر OpenCV رزبری پای با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.
پردازش تصویر OpenCV با رزبری پای
با استفاده از کتابخانه OpenCV پردازش تصویر را در رزبری پای اجرا میشود. OpenCV یک کتابخانه پردازش تصویر و بینایی ماشین است که به صورت گسترده در زمینههایی مانند تشخیص چهره، تشخیص شی پیگیری حرکت، رباتیک و بسیاری از برنامههای بینایی ماشین استفاده میشود.برای شروع، ابتدا باید OpenCV را در رزبری پای خود نصب کنید. برای نصب OpenCV در رزبری پای، میتوانید از دستورات زیر استفاده کنید:ابتدا، به روزرسانی سیستم عامل رزبری پای خود را انجام دهید:
- sudo apt-get update
- sudo apt-get upgrade
سپس، OpenCV را نصب کنید:
- sudo apt-get install libopencv-dev python-opencv
در انتها، برنامه خود را با استفاده از کد Python و کتابخانه OpenCV بنویسید و اجرا کنید. به عنوان مثال، یک برنامه ساده برای خواندن و نمایش یک تصویر میتواند به صورت زیر باشد:
- import cv2
# خواندن تصویر
image = cv2.imread(‘image.jpg’)
# نمایش تصویر
cv2.imshow(‘Image’, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
در این مثال، تصویر با نام “image.jpg” خوانده شده و در یک پنجره نمایش داده میشود. برای اتمام برنامه، میتوانید کلید ESC را فشار دهید.با استفاده از OpenCV، میتوانید عملیات پردازش تصویری متنوعی مانند تشخیص چهره، تشخیص لبخند، تشخیص شیء، استخراج ویژگیهای تصویر، تبدیل تصاویر و بسیاری از وظایف دیگر را انجام دهید. مستندات رسمی OpenCV و نمونههای کد آن به شما کمک میکند تا با توابع و قابلیتهای مختلف آشنا شوید و بتوانید پروژههای پردازش تصویر خود را پیادهسازی کنید.
اهداف پردازش تصویر
شما در این آموزش یاد خواهید گرفت که چگونه چندین عملیات محاسباتی در تصاویر مانند اضافه کردن، تفریق، عملیات بیتی و غیره را انجام دهید. به عبارتی ترکیب تصاویر در نرم افزار OpenCV را آموزش خواهیم داد. این عملیاتها با توابعی از جمله cv2.add(), cv2.addWeighted() و غیره امکان پذیرند.
تابع cv2.addWeighted
تابع cv2.addWeighted در کتابخانه OpenCV برای ترکیب دو تصویر با وزنهای مختلف استفاده میشود. این تابع با استفاده از معادله زیر تصویر جدیدی را ایجاد میکند:
- dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
- src1 و src2 تصاویر ورودی است که قرار است ترکیب شوند.
- alpha و beta وزنهای مربوط به تصاویر src1 و src2 هستند. این وزنها نسبت میانگینی از شدت هر تصویر در ترکیب نهایی را مشخص میکنند.
- gamma یک مقدار عددی است که به تصویر نهایی اضافه میشود.
- وزنها alpha و beta باید در بازهٔ ۰ تا ۱ باشند و مجموع آنها باید ۱ باشد. اگر alpha بزرگتر از beta باشد، تصویر src1 بیشتر در ترکیب نهایی تأثیر خواهد گرفت و برعکس.
به عنوان مثال، فرض کنید میخواهید دو تصویر را با هم ترکیب کنید. در این حالت، میتوانید از تابع cv2.addWeighted استفاده کنید. در زیر مثالی را برای ترکیب دو تصویر با وزنهای مختلف میبینید:
- import cv2
# خواندن تصاویر
image1 = cv2.imread(‘image1.jpg’)
image2 = cv2.imread(‘image2.jpg’)
# ترکیب تصاویر با وزنهای مختلف
alpha = 0.5
beta = 0.5
gamma = 0
combined_image = cv2.addWeighted(image1, alpha, image2, beta, gamma)
# نمایش تصویر ترکیب شده
cv2.imshow(‘Combined Image’, combined_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
در این مثال، دو تصویر با نامهای “image1.jpg” و “image2.jpg” خوانده شده و با استفاده از تابع cv2.addWeighted با وزنهای alpha و beta ترکیب شدهاند. نتیجه ترکیب در تصویر combined_image قرار داده میشود و در نهایت نمایش داده میشود.با تغییر وزنها و استفاده از تابع cv2.addWeighted، میتوانید تصاویر را با نسبتهای مختلف ترکیب کنید و نتایج جالبی را بدست آورید.
تابع cv2.add()
تابع cv2.add در کتابخانه OpenCV برای افزودن دو تصویر با هم استفاده میشود. این تابع به طور پیشفرض عمل جمع را برای هر پیکسل در دو تصویر انجام میدهد. این تابع برای تصویرهایی با همان ابعاد و نوع داده استفاده میشود.در حالت ساده، فرض کنید دو تصویر با نام image1 و image2 را داشته باشید و میخواهید آنها را با هم جمع کنید. میتوانید از تابع cv2.add برای این کار استفاده کنید. در زیر مثالی را مشاهده میکنید:
- import cv2
# خواندن تصاویر
image1 = cv2.imread(‘image1.jpg’)
image2 = cv2.imread(‘image2.jpg’)
# جمع دو تصویر
added_image = cv2.add(image1, image2)
# نمایش تصویر جمع شده
cv2.imshow(‘Added Image’, added_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
در این مثال، دو تصویر با نامهای “image1.jpg” و “image2.jpg” خوانده شده و با استفاده از تابع cv2.add با هم جمع میشوند. نتیجه جمع در تصویر added_image قرار داده میشود و در نهایت نمایش داده میشود.توجه داشته باشید که هنگام استفاده از تابع cv2.add، مقادیر پیکسلهای تصاویر با هم جمع میشوند، و اگر نتیجه جمع بیشتر از ۲۵۵ باشد، مقدار نهایی به ۲۵۵ محدود میشود. این مسئله باعث میشود تا نتیجه جمع تصاویر اغلب در بازه سفیدی به دست آید.اگر میخواهید تصاویر را جمع کنید اما از محدودیت ۲۵۵ برای پیکسلها خارج شوید، میتوانید از تابع cv2.add با استفاده از تابع cv2.addWeighted استفاده کنید و وزنهای مختلف برای تصاویر تنظیم کنید.
افزودن تصاویر
برای افزودن تصاویر به هم میتوانیم از تابع cv2.add() استفاده کنیم. در این صورت دو تصویر را به عنوان آرگومان برای این تابع تعریف میکنیم. همچنین میتوانید با استفاده از کتابخانه numpy به سادگی تصاویر را با هم جمع کنید res = img1 + img2
. دقت کنید که تصاویر باید از یک نوع بوده و ابعاد یکسانی داشته باشند. همچنین میتوانید به راحتی یک عدد اسکالر را با یک عکس جمع کنید. دقت کنید که عملیات افزودن با استفاده از توابع opencv و numpy متفاوت هستند. در opencv عملیات اشباع شده است و در numpy عملیاتی پیمانهای ولی OpenCV نتایج بهتری را ارائه میدهد. به عنوان مثال نمونه زیر را در نظر بگیرید:
x = np.uint8([250]) y = np.uint8([10]) print cv2.add(x,y) # ۲۵۰+۱۰ = ۲۶۰ => 255 #خروجی : [[۲۵۵]] print x+y # ۲۵۰+۱۰ = ۲۶۰ % ۲۵۶ = ۴ #خروجی : [۴]
x و y در این مثال همانند یک تصویر عمل میکنند.
ترکیب تصاویر
ترکیب تصاویر همانند افزودن تصاویر به هم میباشد. فقط به هر کدام وزن و مقدار خاصی شفافیت اختصاص پیدا میکند. برای اینکار ما از تابع cv2.addWeighted()
استفاده میکنیم. که تصویر را با فرمول زیر میسازد:
حال به این نمونه دقت کنید:
import cv2 img1 = cv2.imread('img1.png') img2 = cv2.imread('img1.jpg') dst = cv2.addWeighted(img1,0.7,img2,0.3,0) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()
در این نمونه ما ۰٫۷ از وزن تصویر img1 و ۰٫۳ از وزن img2 استفاده کرده ایم و گاما ۰ میباشد و نتیجه به این صورت خواهد بود:
عملیات بیتی (bitwise) روی تصاویر
منظور از این عملیاتها، فرآیندهای AND, OR, NOT و XOR میباشد. این عملیاتها برای استخراج بخش خاصی از تصویر مفید خواهد بود که در آینده خواهیم دید چقدر مفید هستند. این عملیات ها برای کار با ROI بخشی از تصاویر غیر مستطیلی هستند. در زیر نمونه ای از نحوه تغییر یک منطقه خاص از یک تصویر را خواهیم دید.
import cv2 # بارگذاری دو تصویر img1 = cv2.imread('img.jpg') img2 = cv2.imread('digispark.png') # میخواهیم لوگو را در گوشه سمت چپ بالا قرار دهیم # برای اینکار یک ROI تعریف میکنیم rows,cols,channels = img2.shape roi = img1[0:rows, 0:cols ] # حال یک ماسک و ماسک معکوس از لوگو میسازیم. img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask) # حال منطقه لوگو را سیاه سفید میکنیم img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv) # حال فقط منطقه ای از لوگو که میخواهیم را برمیداریم img2_fg = cv2.bitwise_and(img2,img2,mask = mask) # لوگو را در ROI قرار داده و روی تصویر اصلی اعمال میکنیم dst = cv2.add(img1_bg,img2_fg) img1[0:rows, 0:cols ] = dst cv2.imshow('res',img1) cv2.waitKey(0) cv2.destroyAllWindows()
همانطور که مشاهده میکنید، توانستیم لوگویی را به عنوان واتر مارک به عکس خود اضافه کنیم. ولی اگر میخواستیم دو تصویر را به هم اضافه کنیم رنگ آنها دچار تغییر میشد. اگر میخواستیم ترکیب کنیم، یک اثر شفافیت در تصویر به وجود می آمد ولی ما میخواستیم که یک تصویر کاملا بدون شفافیت داشته باشیم. اگر میخواستیم یه تصویر مستطیلی اضافه کنیم همانطور که در آموزش قبلی آموزش دادیم میتوانستیم این کار را انجام دهیم ولی لوگو مستطیل شکل نیست پس این کار فقط از طریق عملیات بیتی امکان پذیر بود.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
پروژه و دریافت بن ارسال رایگان
برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکههای اجتماعی از جمله آپارات و اینستگرام، با هشتگهای دیجی_اسپارک دانشجوکیت digispark daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.