1. 仿射变换基础概念解析
在计算机视觉和图像处理领域,仿射变换(Affine Transformation)是一种保持直线性和平行性的二维几何变换。简单来说,就是图像在经过变换后,原本平行的直线仍然保持平行,但长度和角度可能会发生变化。
注意:仿射变换与透视变换(Projective Transformation)不同,后者可以改变平行关系,常用于3D场景的2D投影。
仿射变换的核心数学原理可以用一个2×3的变换矩阵来表示:
code复制[ a11 a12 b1 ]
[ a21 a22 b2 ]
这个矩阵可以分解为线性变换和平移变换两部分:
- 左上角的2×2子矩阵(a11,a12,a21,a22)负责旋转、缩放和剪切
- 最右边的2×1子矩阵(b1,b2)负责平移
在OpenCV中,我们通常使用3×3的齐次坐标矩阵来表示仿射变换,这样可以通过矩阵乘法来组合多个变换:
code复制[ a11 a12 b1 ]
[ a21 a22 b2 ]
[ 0 0 1 ]
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 仿射变换的数学原理详解
2.1 平移变换的数学表达
平移是最简单的仿射变换,其数学表达式为:
x' = x + t_x
y' = y + t_y
对应的变换矩阵为:
code复制[ 1 0 t_x ]
[ 0 1 t_y ]
[ 0 0 1 ]
在C#中使用OpenCVSharp实现时,我们可以这样构建平移矩阵:
csharp复制Mat translationMatrix = new Mat(2, 3, MatType.CV_32FC1);
translationMatrix.Set(0, 0, 1f); // a11
translationMatrix.Set(0, 1, 0f); // a12
translationMatrix.Set(0, 2, 50f); // t_x (水平平移50像素)
translationMatrix.Set(1, 0, 0f); // a21
translationMatrix.Set(1, 1, 1f); // a22
translationMatrix.Set(1, 2, 30f); // t_y (垂直平移30像素)
2.2 旋转变换的数学原理
旋转变换
