در بخش قبلی آموزش پردازش تصویر با نرم افزار OpenCV به عملیات پایه روی تصاویر پرداختیم. در این بخش و ششمین قسمت از آموزش به عملیات محاسباتی تصاویر با ترکیب تصاویر در نرم افزار OpenCV میپردازیم. در ادامه آموزش پردازش تصویر OpenCV رزبری پای با دیجی اسپارک، مرجع تخصصی رزبری پای به زبان فارسی همراه باشید.
اهداف پردازش تصویر
شما در این آموزش یاد خواهید گرفت که چگونه چندین عملیات محاسباتی در تصاویر مانند اضافه کردن، تفریق، عملیات بیتی و غیره را انجام دهید. به عبارتی ترکیب تصاویر در نرم افزار OpenCV را آموزش خواهیم داد. این عملیاتها با توابعی از جمله 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 منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.