ترکیب کردن دو تصویر در OpenCV

در برخی از عملیات های پردازش تصویر در برخی از کاربردها متداول است که یک یا چندین تصویر را دریافت کند و سپس یک تصویر جدید به عنوان خروجی برگشت داده شود. یکی از این کاربردها، ترکیب کردن (Blending) دو تصویر و ایجاد یک تصویر جدید است.

هدف از این مطلب آموزش مفهوم ترکیب خطی (Linear Blend) و کاربرد آن است. سپس در ادامه تابع ()addWeighthted برای افزودن دو عکس توضیح داده می شوند. عملگر ترکیب خطی (یا Linear Blend) یک عملگر دوتایی (یا دو ورودی) است که به صورت معادله زیر تعریف می شود.

با توجه به اینکه مقدار ? بین صفر تا یک (?→?) تغییر می کند، می توانیم از معادله بالا برای انجام یک اتصال موقتی میان تصویر یا ویدیوها استفاده کنیم. برای ترکیب دو تصویر می توانیم از تابع ()addWeighted استفاده کنیم. در ادامه مثالی از کاربرد این تابع را نشان داده ایم. در واقع در شکل بالا هر یک از توابع f₁ و f₂ معادل یک تصویر هستند. مقدار ? بین صفر تا یک (?→?) و مقدار ? = ? – ? در دو تابع ضرب می شوند.

تابع addWeightedمحاسبات روی ماتریس ها در OpenCV

در کد زیر با استفاده از معادله شکل بالا می خواهیم تصویری از ترکیب دو تصویر دیگر بسازیم. در خطوط ۷ و ۸ ابتدا توسط تابع سازنده کلاس Mat و توسط کلاس Scalar دو تصویر رنگی RGB می سازیم. در خط ۹ نیز یک ماتریس از نوع کلاس Mat به اندازه و از نوع یکی از تصویرهای ورودی ایجاد کرده ایم.

تصویر و ماتریس در OpenCV – ایجاد ماتریس ها

در خطوط ۱۱ و ۱۲ دو متغیر از نوع double تعریف کرده ایم. متغیر alpha با مقدار اولیه 0.0 وبه این معنی است که ضریب ? نمی تواند کوچکتر از صفر و منفی باشد. در خطوط ۱۴ تا ۱۸ و به اندازه تعداد سطرهای یکی از ماتریس های ورودی، دو دستور زیر تکرار می شوند.

از متد ()col از کلاس Mat، که مقدار شمارنده i به آن ارسال شده است، برای دسترسی به مقدار ستون i ام در تصویر استفاده می شود. بنابراین مقدار ستون i در ماتریس خروجی که res نام دارد، از محاسبه خط ۱۶ بدست می آید. توجه کنید که در این کد دو تصویر ورودی به نام های l و r داریم.

در خط ۱۷ در نهایت و در هر تکرار مقدار alpha با مقدار قبلی step جمع می شود. توجه کنید که مقدار متغیر alpha نباید بیش از یک شود پس در خط ۱۱ متغیر step عددی کوچک است که حاصل تقسیم عدد ۱ بر تعداد ستون های یکی از ماتریس های تصویر ورودی است.

از متد ()row از کلاس Mat، می توانیم برای دسترسی به مقدار سطر i ام در تصویر استفاده کنیم.

در این مثال و در خطوط ۷ و ۸ اندازه دو ماتریس ورودی یکسان است، پس فرقی ندارد از کدام یک از آنها در شرط حلقه for استفاده کنیم ولی در عبارت خط ۱۶ ماتریس به نام l معادل تابع f₁ و ماتریس به نام r معادل تابع f₂ در معادله شکل بالا هستند.

مثال – ترکیب تصویرها با تابع ()addWeighted

در مطلب محاسبات روی ماتریس ها در OpenCV تابعی به نام ()addWeighted را معرفی کردیم که عملیات جمع المان به المان دو ماتریس را انجام می دهد. در کد زیر و توسط این تابع می خواهیم دو تصویر را با یکدیگر ترکیب کنیم.

در خطوط ۱۵ و ۱۶ مقدار بین صفر تا یک (البته از نوع double) برای متغیر alpha گرفته می شود و همچنین در خط ۲۹ متغیر beta با مقدار alpha – 1.0 مقدار دهی می شود. اگر به مطلب مورد نظر تابع ()addWeighted مراجعه کنید خواهید دید که معادله آن به صورت زیر است.

اگر فرض کنیم مقدار gamma برابر صفر است، پس در واقع معادله خط بالا شبیه به معادل شکل بالا در همین مطلب است. اگر به خط ۳‍۱ از فراخوانی تابع ()addWeighted نگاه کنید می بینید که مقدار آرگومان پنجم برابر با 0.0 است که اشاره به مقدار gamma دارد. همچنین در تابع ()addWeighted آرگومان آخر، تصویر خروجی را تعیین می کند.