图像仿射变换

本文详细介绍了仿射变换的概念,包括其数学定义和实际应用。通过两个具体的OpenCV示例,展示了如何使用仿射变换进行图像平移、缩放和旋转。在每个例子中,通过定义源和目标坐标点,计算出仿射变换矩阵,并使用`cv2.getAffineTransform`和`cv2.warpAffine`函数实现图像变换。这些操作对于图像处理和计算机视觉领域的图像变形和匹配至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 引用

opencv学习(三十五)之仿射变换warpAffine

2. 什么是仿射变换?

在这里插入图片描述

3. 定义

向量空间中进行一次线性变换(乘以一个矩阵A)再加上一个平移(加上一个向量B)。
现定义参数A,B和AB的组合M(固定尺寸2*3):
在这里插入图片描述
定义自变量(起始量):
在这里插入图片描述
则X → T 的仿射变换过程可以表达式为:
在这里插入图片描述
或者:
在这里插入图片描述
得到结果T:
在这里插入图片描述
其实可以看出,矩阵M中a决定缩放旋转等性质,b决定平移性质。若a为单位矩阵,则M实际是表示平移b的效果:
仿射变换(Affine Transformation)

4. 常用的转换矩阵

在这里插入图片描述

5.实际应用

我们知道仿射变换一句话概括:原始图像IMG1在矩阵M的变换下,得到结果图像IMG2。
那么实际的应用就分两种情况:

  • 知自变量和因变量X和T,求参数M(即A和B)【求关系–M代表IMG1和IMG2的关系】
  • 知自变量X和参数M,求结果T 【求结果–知道IMG1和矩阵M,就结果图】

在这里插入图片描述
由上式可见,完成仿射变换的公式含有6个未知数,则需要6个公式来表示才可解,所以完成图像的仿射变换需要三个点的对应关系,从而解出6个未知数,通过仿射公式对全部图像像素点进行仿射变换,所以在实际应用中需要先知晓3对坐标点的位置,计算出映射关系的仿射矩阵𝑀𝑀,再对全部像素进行仿射变换运算得到仿射后的图,完成仿射变换。

5.1 栗子1

在openCV中:
比如将128*128的图像上移30,左移30,则:
在这里插入图片描述
我们已经得到有三对相应点

# 定义原图中三个点pts1
pts1=np.float32(([0,0],[0,127],[127,127]))

# 定义结果图中三个点pts2
pts2=np.float32(([30,0],[30,97],[127,97]))

# 利用这三对点,求出变换矩阵M
M=cv2.getAffineTransform(pts1,pts2)

# 再利用变换矩阵对原图所有像素点进行变换
# 并指定了输出图像的shape和原图shape一样
res=cv2.warpAffine(img,M,dsize=img.shape[0:2])

cv2.imshow("",res)
cv2.waitKey(0)

在这里插入图片描述

5.2 栗子2

  • 使用仿射变换,将图片在x方向上放大1.3倍,在y方向上缩小至原来的4/5。
    对应的坐标如下:
    在这里插入图片描述
    代码如下:
import numpy as np
import cv2

img=cv2.imread("../imori.jpg")

pts1=np.float32(([0,0],[0,127],[127,127]))
pts2=np.float32(([0,0],[0,101],[165,101]))

M=cv2.getAffineTransform(pts1,pts2)
# 在定义输出图像尺寸时,从上图可以看出,有效图片在165*101部分
res=cv2.warpAffine(img,M,(165,101))

cv2.imshow("",res)
cv2.waitKey(0)

在这里插入图片描述
如果在上面的结果之上,同时在x方向上向右平移30,在y方向上向上平移30呢?
对应坐标为:
在这里插入图片描述
如法炮制,代码:

import numpy as np
import cv2

img=cv2.imread("../imori.jpg")

pts1=np.float32(([0,0],[0,127],[127,127]))
pts2=np.float32(([30,0],[30,71],[195,71]))

M=cv2.getAffineTransform(pts1,pts2)
# 在定义输出图像尺寸时,从上图可以看出,有效图片在165*101部分
res=cv2.warpAffine(img,M,(165,101))

cv2.imshow("",res)
cv2.waitKey(0)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值