【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

时间:2023-02-10 17:13:37

仿射变换

仿射变换(Affine Transformation或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。
那么, 我们能够用仿射变换来表示如下三种常见的变换形式:
旋转,rotation (线性变换)
平移,translation(向量加)
缩放,scale(线性变换)
仿射变换代表的是两幅图之间的一种映射关系,使用矩阵 A 和 B 对二维向量X=[x,y]T 做变换

【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放
通常使用2 x 3的矩阵来表示仿射变换,所以也能表示为下列形式:
【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

仿射变换应用场景:

1.已知 X和T,求矩阵 M
2.已知 M和X,求得T

对一张图片旋转、平移、缩放就属于场景2

仿射变换相关的函数

OpenCV仿射变换相关的函数一般涉及到warpAffine和getRotationMatrix2D这两个:
warpAffine 来实现一些简单的重映射
getRotationMatrix2D 来获得旋转矩阵

warpAffine函数

warpAffine函数的作用是依据如下式子,对图像做仿射变换

【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

void warpAffine(
InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags=INTER_LINEAR,
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar())

InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。
InputArray类型的M,2×3的变换矩阵。
Size类型的dsize,表示输出图像的尺寸。
int类型的flags,插值方法的标识符。此参数有默认值INTER_LINEAR(线性插值),可选的插值方式如下:
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认值)
INTER_AREA - 区域插值
INTER_CUBIC –三次样条插值
INTER_LANCZOS4 -Lanczos插值
CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
CV_WARP_INVERSE_MAP –表示M为输出图像到输入图像的反变换,即 。因此可以直接用来做象素插值。否则, warpAffine函数从M矩阵得到反变换。
第六个参数,int类型的borderMode,边界像素模式,默认值为BORDER_CONSTANT。
第七个参数,const Scalar&类型的borderValue,在恒定的边界情况下取的值,默认值为Scalar(),即0。

旋转

getRotationMatrix2D函数,可以由旋转中心center、旋转角度angle、缩放系数scale,计算出计算二维旋转变换矩阵,即warpAffine函数的第三个参数,再使用warpAffine函数进行仿射变换

【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放

getRotationMatrix2D函数原型:

cv::Mat cv::getRotationMatrix2D( Point2f center,double angle, double scale )  
{
angle *= CV_PI/180;
double alpha = cos(angle)*scale;
double beta = sin(angle)*scale;

Mat M(2, 3, CV_64F);
double* m = (double*)M.data;

m[0] = alpha;
m[1] = beta;
m[2] = (1-alpha)*center.x - beta*center.y;
m[3] = -beta;
m[4] = alpha;
m[5] = beta*center.x + (1-alpha)*center.y;

return M;
}

Point2f类型的center,表示源图像的旋转中心
double类型的angle,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)
double类型的scale,缩放系数

缩放

平移