عملیات دگرگونی (تبدیل یا Transformation) بر روی یک تصویر معمولا به عنوان دگرگونی هندسی شناخته می شود، که در یک عکس کاربرد دارد. چندین نوع عملیات دگرگونی وجود دارد، اما در این بخش ما به دگرگونی های هندسی اشاره خواهیم کرد. این می تواند در برگیرنده، انتقال (Sifting) تصویر، چرخاندن (Rotating) یک تصویر در امتداد یک محور (Axis) باشد. در هسته دگرگونی، یک ماتریس در تصویر ضرب می شود. به گفته بهتر، یک ماتریس در ماتریس تصویر ضرب می شود.

Flip کردن تصویرها و ویدیوها در OpenCV

جابجایی تصویر

جابجایی تصویر (Displacement) در هر سو (جهت) می تواند با اعمال یک ماتریس دگرگونی (Transformation Matrix) به ماتریس تصویر انجام می شود. شکل زیر این ماتریس را برای جابجایی تصویر نشان می دهد. در آن tx اندازه جابحایی در راستای x و ty اندازه جابحایی در راستای y است. توجه کنید t آغازین tx و ty سرآغاز واژه Translation است که آن را به فارسی، می توان حرکت انتقالی نیز برگردانیم.

  • نخست باید مقدارهای tx و ty را با توجه به نیاز خودتان مشخص کنید.
  • سپس باید ماتریس 3x3 بسازید و دو متغیر اشاره کننده به مقدارهای tx و ty را در آن بگذارید.
  • ماتریس دو بعدی مربعی 3x3 و به گونه زیر در برنامه شناسانده (تعریف) می شود.

همچنین برابر با کد زیر، نخست دو متغیر به نام های width و height در برنامه شناسانده ایم و سپس مقدارهای [shape[1 و [shape[0 را در آن ریخته ایم. توجه کنید که تصویر ورودی ما رنگی سه کانالی RGB است، پس اندیس دوم (شماره 1) از shape به اندازه پنهنا (عرض) و اندیس یکم (شماره 0) به درازا (ارتفاع) اشاره دارند. سپس tx و ty به اندازه نمی از پهنا  درازا شناسانده (تعریف) شده اند.

تابع warpAffine برای اعمال دگرگونی (تبدیل) هندسی Translation به کمک ماتریس

تابع ()warpAffine سه آرگومان را دریافت می کند که ورودی یکم، متغیری است که به ماتریس تصویر نخستین (اولیه) اشاره می کند. آرگومان دوم، ماتریسی است که پیش از این با مقدارهای tx و ty ساخته ایم و می خواهیم آن را به ماتریس تصویر اعمال کنیم. آرگومان سوم نیز یک تاپل با دو مقدار پهنا و درازا تصویر است که در این نوشته در متغیرهای width و height نگهداری می شوند. در کدهای زیر متغیر output_size همان تاپلی است که به آرگومان سوم فرستاده می شوند. در واقع این آرگومان اندازه پهنا (Width) و درازا (Height) تصویر برگشتی را پس از انجام تابع warpAffine مشخص می کند. کدهای زیر همه گام های تبدیل Translation را نشان می دهد. شما می توانید مقدارهای دیگری را برای tx و ty و اندازه تصویر برگشتی را مشخص کنید.

چرخاندن تصویر یا Rotation و تابع getRotationMatrix2D

همانند Translation، چرخاندن تصویر نیز با ساختن یک ماتریس دگرگونی هندسی اتحام شدنی است. شکل زیر ساختار ماتریس چرخش تصویر و شکل دیگر چگونگی محاسبه دو مقدار ثابت آلفا و بتا را نشان را نشان می دهند ولی این ماتریس پیچیده چگونه باید ساخته شود؟ در اینجا است که تابع دیگری باید به نام getRotationMatrix2D به کار گرفته شود.

بخش هایی از کدهای بالا را پیش از این گفته ایم و تنها آنهایی که در کد پیشین نیستند را خواهیم گفت. در آغاز، در کد نخست، دیدیم که ماتریس دگرگونی را دستی ساختیم و تنها دو متغیر tx و ty را بر پایه پهنا و درازا تصویر، به این ماتریس فرستادیم ولی در کد زیر دیگر ماتریس دگرگونی دستی شناسانده (تعریف) نشده است و به جای این، تابعی به نام getRotationMatrix2D با مقدارهایی فراخوانی شده که برگشتی آن، همان ماتریس دگرگونی است که در اینجا آن را در متغیر rotation_matrix نگهداری می کنیم و سپس همین متغیر به آرگومان دوم تابع warpAffine فرستاده شده است.

در کد بالا، ماتریسی برای چرخش 90 درجه ای بر حول مرکز تصویر ساخته می شود، بدون آنکه تصویر برگشتی تغییر اندازه پیدا کند. حول مرکز انجام می شود، زیرا آرگومان یکم، تاپلی است که مختصات نقطه (x, y) را مشخص می کند که در اینحا x=width/2 و y=heigth/2 هستند. آرگومان دوم، زاویه چرخش را برابر با 90 درجه دریافت کرده و سپس چون واپسین (آخرین) آرگومان 1 است، تصویر برگشتی هم اندازه خواهد بود.

دگرگونی همگر یا آفین

تبدیل همگر یا دگرگونی آفین (Affine transformation) نوعی تبدیل ریاضی است که هم‌خطی‌بودن و نسبت فاصله‌ها در آن حفظ می‌شود. بدین ترتیب در نتیجه یک تبدیل همگر، تمامی نقاط روی یک خط در ورودی، در خروجی نیز روی یک خط خواهند ماند. با این وجود در تبدیل‌های همگر طول و زاویه بین خط‌ها لزوماً حفظ نمی‌شود. انتقال، تجانس، تشابه و چرخش نمونه‌هایی از تبدیل‌های همگر هستند. همچنین هر تبدیل خطی یک تبدیل همگر است، با این وجود هر تبدیل همگری خطی نیست. مثلث‌ها آفین یکدیگر هستند، به این معنی که هر مثلثی را می‌توان با استفاده از یک تبدیل آفین به هر مثلث دیگری تبدیل کرد. (ویکی پدیا فارسی)

در دگرگونی همگر، همه خط های موازی در تصویر نخستین (اولیه) هنوز در تصویر برگشتی موازی هستند. برای پیدا کردن ماتریس دگرگونی، ما نیاز به سه نقطه از تصویر ورودی و نقاط مربوطه خود در تصویر خروجی داریم. تابع getAffineTransform ماتریس 2x3 برگشت می هد که آن را درون تابع warpAffine به کار می بریم.

در کد بالا دو متغیر pts1 و pts2 را ساخته ایم که هر کدام دارای سه عنصر هستند و هر عنصر دارای دو مقدار (x, y) است که مختصات یکی از سه نقطه را نشان می دهند. pts1 نقطه های درون تصویر نخستین (اولیه) و pts2 نقطه های درون تصویر برگشتی هستند. سپس این دو متغیر به آرگومان یکم و دوم تابع getAffineTransform فرستاده شده اند و مقدار برگشتی تابع که ماتریس دلخواه ما است در متغیر affine_matrix نگه داشته می شود. نقطه های سبز رنگ در تصویر سمت چپ (تصویر نخستین) همان pts1 و نقطه های در تصویر سمت راست (تصویر برگشتی) همان pts2 هستند.