Affine Transformation
یک تصویر را می توان به انواع مدل هایی که در تصویر زیر مشاهده می کنید چرخش داد.
تبدیل اقلیدسی فقط یک کلمه فانتزی برای تبدیل است که ترکیبی از ترجمه و چرخش است. توجه داشته باشید که یک تبدیل اقلیدسی شمایل اصلی را حفظ می کند؛خطوط عمود در تصویر اصلی نیز در تصویر تبدیل شده عمودی است. یک Transform Affine ترکیبی از ترجمه (translatetion)، چرخش (rotation)، مقیاس پذیری (scaling) در جهت x و y و یک پارامتر به نام برش (shear) است؛ به این دلیل که ارتوگنال (orthogonality) بودن در این تبدیل حفظ نمی شود. خطوط موازی در تصویر اصلی موازی باقی میمانند، اما خطوط عمود بر یکدیگر، در تصویر متحرک 90 درجه به یکدیگر نیستند. توجه: تمام تغییرات ذکر شده در بالا، تبدیل خطی (linear) هستند. خطوط راست در تصویر اصلی مستقیما در تصویر تبدیل می شوند. در ادامه، در مورد تغییرات غیر خطی نیز یاد خواهیم گرفت. تغییر شکل (affine transform) در OpenCV در OpenCV یک تبدیل Affine در یک ماتریس 2 × 3 ذخیره می شود. دو ستون اول این ماتریس، چرخش، مقیاس و برش را رمزگذاری می کنند و ستون آخر رمزگذاری ترجمه (یعنی تغییر) نگه داری خواهد کرد. در این تبدیل نقاط داده شده (x,y) در تصویر اصلی، در تغییر شکل بالا نقاط را به نقطه های جدید (xt,yt) منتقل و تساوی سازی را انجام می دهد. ترجمه، چرخش و تبدیل اقلیدسی موارد خاصی از تبدیل Affine است. در ترجمه، پارامترهای چرخش، مقیاس و برش صفر هستند، در حالی که در یک تبدیل اقلیدسی پارامترهای مقیاس و برشی صفر هستند. در OpenCV، اگر شما می خواهید یک تبدیل را به کل تصویر اعمال کنید، می توانید از تابع warpAffine استفاده کنید.
#In this program, we will use OpenCV warpaffine function to transform
#a triangle in an image to another triangle as shown in the above figure.
import cv2
import numpy as np
# Read image
source = cv2.imread("sample.jpg",1);
# Createmask/ warp matrix
warpMat = np.float32([[1.2, 0.2, 2],[-0.3, 1.3, 1]])
# Another mask/warp matrix
warpMat2 = np.float32([[1.2, 0.3, 2],[0.2, 1.3, 1]])
# Use warp affine
result = cv2.warpAffine(source, warpMat,(int(1.5*source.shape[0]),
int(1.4*source.shape[1])), None, flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_REFLECT_101 )
result2 = cv2.warpAffine(source, warpMat2, (int(1.5*source.shape[0]),
int(1.4*source.shape[1])), None, flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_REFLECT_101)
# Display images
cv2.imshow("Original",source)
cv2.imshow("Result", result)
cv2.imshow("Result2", result2)
cv2.waitKey(0)
خروجی کد:
تصاویر باید به شما این ایده را بدهد که چگونه تصاویر متحول شده شبیه به یکدیگر هستند. کد برای به دست آوردن این تصاویر نیز بسیار ساده است. در اینجا ماتریس تحول ایجاد شده است. توجه داشته باشید که چرخش به طور پیش فرض در جهت عقربه های ساعت است. سپس ماتریس را در خط 17 کد پایتون قرار می دهیم. پارامتر اندازه تصویر خروجی را مشخص می کند. توجه داشته باشید که برای مشاهده کل تصویر، اندازه بزرگتر از فاکتورهای Scale شدن است. حالت مرزی: BORDER_REFLECT_101 باعث می شود که مرز بخشی از تصویر مجاور آن را منعکس کند و از این طریق یک تصویر کمی اصلاح شده دریافت می کنید. کد ابتدا یک آرایه numpy (در پایتون) از پارامتر می گیرد. نقاط مربوطه در ماتریس تبدیل شده با استفاده از فرمول محاسبه می شود:
تابع getAffineTransform نیاز به دو مجموعه از نقاط، برای محاسبه ماتریس تبدیل دارد. همانطور که از خروجی مشخص است، ماتریس همان چیزی است که ما در کد قبلی ایجاد کرده بودیم.