编辑
2025-09-25
C#
00

目录

仿射变换的基本概念
应用场景
图像旋转
图像缩放
图像配准
形状矫正
仿射变换的特点
OpenCvSharp实现仿射变换
安装OpenCvSharp
代码示例
例子 2:图像旋转
例子 3:图像缩放
例子 4:图像剪切
例子 5:图像镜像变换
总结

仿射变换(Affine Transformation)是一种线性映射方法,用于对图像进行几何变换,包括旋转、缩放、平移和剪切等。它在计算机视觉、图像处理和模式识别中有着广泛的应用。本文将通过OpenCvSharp库介绍仿射变换的概念、应用场景、特点及其实现。

仿射变换的基本概念

  1. 确定控制点:选择至少三个点对,使其不仅存在于原始图像中,还存在于目标图像中,这些点用于计算仿射变换矩阵。
  2. 计算变换矩阵:利用已知的控制点,通过解决方程组来获取变换矩阵。
  3. 应用变换:对图像的每个像素位置应用变换矩阵,生成变换后的图像。

应用场景

图像旋转

旋转变换是仿射变换的一种特殊情况,广泛应用于图像的特征对齐。例如,在人脸识别中,为使面部特征标准化,常需旋转图像以便统一视角。

图像缩放

图像缩放用于调整图像的大小,缩放操作也是通过仿射变换实施的。这在图像预处理和数据增强的任务中得到大量应用。

图像配准

图像配准是指通过几何变换,将多幅图像中的同名点相互对齐的过程。仿射变换由于其线性性质是一种有效的配准方式,广泛应用于医学图像分析。

形状矫正

仿射变换可用于对图像中的形状进行矫正,特别是在需要处理图像中的透视失真时。

仿射变换的特点

  1. 线性变换:仿射变换主要用于实现线性操作,能够保持直线的平直和平行线的平行。
  2. 六自由度:包含六个参数:旋转、缩放、平移和剪切,提供了多功能性。
  3. 二维和三维延展性:主要用于二维图像处理,但可以拓展至三维应用场景。
  4. 效率高:由于其线性特性,计算效率高,适合实时应用。

OpenCvSharp实现仿射变换

安装OpenCvSharp

确保您已安装OpenCvSharp库,可以使用NuGet Package Manager进行安装:

PowerShell
Install-Package OpenCvSharp4.Windows -Version 4.0.0.20190108

代码示例

下面展示了如何使用OpenCvSharp库实现图像的仿射变换,包括加载图像、定义变换矩阵和应用变换。

C#
static void Main(string[] args) { // 读取两幅灰度图像 Mat src = Cv2.ImRead("ai.jpg", ImreadModes.Color); // 检查图像加载是否成功 if (src.Empty()) { Console.WriteLine("图像加载失败!"); return; } // 定义变换前后对应的三个点 Point2f[] sourcePoints = { new Point2f(50, 50), new Point2f(200, 50), new Point2f(50, 200) }; Point2f[] destinationPoints = { new Point2f(70, 100), new Point2f(250, 50), new Point2f(100, 250) }; // 计算仿射变换矩阵 Mat affineMatrix = Cv2.GetAffineTransform(sourcePoints, destinationPoints); // 输出变换矩阵(用于调试查看) Console.WriteLine(affineMatrix.Dump()); // 应用仿射变换 Mat dst = new Mat(); Cv2.WarpAffine(src, dst, affineMatrix, src.Size()); // 显示结果 Cv2.ImShow("Source Image", src); Cv2.ImShow("Warped Image", dst); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); }

image.png

例子 2:图像旋转

图像旋转是仿射变换的一种常见应用,通常用于图像特征对齐。以下代码演示了如何用OpenCvSharp实现一个简单的旋转。

C#
static void Main(string[] args) { // 读取两幅灰度图像 Mat src = Cv2.ImRead("ai.jpg", ImreadModes.Color); // 检查图像加载是否成功 if (src.Empty()) { Console.WriteLine("图像加载失败!"); return; } // 图像中心 Point2f center = new Point2f(src.Width / 2.0f, src.Height / 2.0f); // 旋转角度和缩放因子 double angle = 45.0; double scale = 1.0; // 计算旋转矩阵 Mat rotationMatrix = Cv2.GetRotationMatrix2D(center, angle, scale); // 输出旋转矩阵 Console.WriteLine(rotationMatrix.Dump()); // 应用旋转变换 Mat dst = new Mat(); Cv2.WarpAffine(src, dst, rotationMatrix, src.Size()); // 显示结果 Cv2.ImShow("Original Image", src); Cv2.ImShow("Rotated Image", dst); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); }

image.png

例子 3:图像缩放

图像缩放改变图像的尺寸,是图片预处理中的常见操作。在仿射变换中,缩放可以通过调整矩阵中的缩放因子实现。

C#
static void Main(string[] args) { // 读取两幅灰度图像 Mat src = Cv2.ImRead("ai.jpg", ImreadModes.Color); // 检查图像加载是否成功 if (src.Empty()) { Console.WriteLine("图像加载失败!"); return; } // 定义缩放因子 double fx = 1.5, fy = 1.5; // 应用缩放变换 Mat dst = new Mat(); Cv2.Resize(src, dst, new Size(), fx, fy, InterpolationFlags.Linear); // 显示结果 Cv2.ImShow("Original Image", src); Cv2.ImShow("Scaled Image", dst); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); }

image.png

例子 4:图像剪切

图像剪切(又称斜切)是一种将图像变形的操作,可以通过调节变换矩阵中非对角线的位置参数实现。

C#
static void Main(string[] args) { // 读取两幅灰度图像 Mat src = Cv2.ImRead("ai.jpg", ImreadModes.Color); // 检查图像加载是否成功 if (src.Empty()) { Console.WriteLine("图像加载失败!"); return; } // 变换矩阵(剪切) double shearX = 0.5; // 水平剪切因子 Mat shearMatrix = new Mat(2, 3, MatType.CV_32F, new float[] { 1, (float)shearX, 0, 0, 1, 0 }); // 应用剪切变换 Mat dst = new Mat(); Cv2.WarpAffine(src, dst, shearMatrix, new Size(src.Width + (int)(src.Height * shearX), src.Height)); // 显示结果 Cv2.ImShow("Original Image", src); Cv2.ImShow("Sheared Image", dst); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); }

image.png

例子 5:图像镜像变换

镜像变换通过对矩阵中相关参数设置符号,您可以实现对图像的水平或垂直镜像。

C#
static void Main(string[] args) { // 读取两幅灰度图像 Mat src = Cv2.ImRead("ai.jpg", ImreadModes.Color); // 检查图像加载是否成功 if (src.Empty()) { Console.WriteLine("图像加载失败!"); return; } // 定义水平镜像矩阵 Mat mirrorMatrix = new Mat(2, 3, MatType.CV_32F, new float[] { -1, 0, src.Width, 0, 1, 0 }); // 应用镜像变换 Mat dst = new Mat(); Cv2.WarpAffine(src, dst, mirrorMatrix, src.Size()); // 显示结果 Cv2.ImShow("Original Image", src); Cv2.ImShow("Mirrored Image", dst); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); }

image.png

总结

仿射变换是图像处理中的重要工具,能够利用线性映射概念进行复杂的几何变换,因而在很多应用场景中得到广泛应用。利用OpenCvSharp库,开发者能高效地实现仿射变换相关的功能。希望本文提供的介绍和示例代码能够加深您对仿射变换以及OpenCvSharp应用的理解,从而为更复杂的图像处理任务打下基础。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!