仿射变换中的旋转缩放变换矩阵推导

仿射变换可以将矩阵形状转换为平行四边形。可以挤压形状,但是必须保持两边平行。常见的是旋转、缩放、平移变换。缩放和平移比较简单,本文重点推导旋转缩放变换矩阵。

任意一点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)
可以看成 ( x 0 , 0 ) (x_0, 0) (x0,0)向量和 ( 0 , y 0 ) (0,y_0) (0,y0)向量相加,对 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)
绕原点逆时针旋转 θ \theta θ,相当于 ( x 0 , 0 ) , ( 0 , y 0 ) (x_0,0),(0,y_0) (x0,0),(0,y0)
绕原点逆时针旋转 θ \theta θ 后的向量相加。

在图像处理中图片的坐标通常使用的是左手坐标系,如图

x 轴为图片宽度方向,y轴为高度方向。

因此 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 点逆时针旋转 θ \theta θ 后的坐标为
( x 1 y 1 ) = ( x 0 cos ⁡ θ + y 0 sin ⁡ θ , − x 0 sin ⁡ θ + y 0 cos ⁡ θ ) = ( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) ( x 0 y 0 ) \begin{aligned} \begin{pmatrix} x_1 \\ y_1\\ \end{pmatrix} = (x_0 \cos \theta + y_0 \sin \theta, -x_0\sin \theta + y_0 \cos \theta) = \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x_0 \\ y_0\\ \end{pmatrix} \end{aligned} (x1y1)=(x0cosθ+y0sinθ,x0sinθ+y0cosθ)=(cosθsinθsinθcosθ)(x0y0)
旋转矩阵为
( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) . \begin{aligned} \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} . \end{aligned} (cosθsinθsinθcosθ).

上面是绕原点旋转,如果是绕任意一点旋转呢? 假设旋转中心center为
( c x , c y ) (c_x, c_y) (cx,cy)。 我们把坐标原点移动到 ( c x , c y ) (c_x, c_y) (cx,cy) , 旧坐标系任意点(x,
y)在新坐标系下则为 ( x − c x , y − c y ) (x-c_x, y-c_y) (xcx,ycy)
因此在新坐标系下绕原点逆时针旋转 θ \theta θ ,即
( x ∗ y ∗ ) = ( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) ( x − c x y − c y ) \begin{aligned} \begin{pmatrix} x^*\\ y^*\\ \end{pmatrix} = \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x-c_x \\ y-c_y \\ \end{pmatrix} \end{aligned} (xy)=(cosθsinθsinθcosθ)(xcxycy)
新坐标系下旋转后的点 ( x ∗ , y ∗ ) (x^*, y^*) (x,y)在旧坐标系下则为 ( x ∗ + c x , y ∗ + c y ) (x^* + c_x, y^* + c_y) (x+cx,y+cy)
。 因此旧坐标系下绕 ( c x , c y ) (c_x, c_y) (cx,cy) 逆时针旋转 θ \theta θ 后的点为
( x ′ y ′ ) = ( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) ( x − c x y − c y ) + ( c x c y ) = ( cos ⁡ θ x + sin ⁡ θ y − c x cos ⁡ θ − c y sin ⁡ θ + c x − sin ⁡ θ x + cos ⁡ θ y + c x sin ⁡ θ − c y cos ⁡ θ + c y ) = ( cos ⁡ θ sin ⁡ θ ( 1 − cos ⁡ θ ) c x − c y sin ⁡ θ − sin ⁡ θ cos ⁡ θ c x sin ⁡ θ + ( 1 − cos ⁡ θ ) c y ) ( x y 1 ) \begin{aligned} \begin{pmatrix} x'\\ y'\\ \end{pmatrix} =& \begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} x-c_x \\ y-c_y \\ \end{pmatrix} + \begin{pmatrix} c_x\\ c_y\\ \end{pmatrix} \\ =& \begin{pmatrix} \cos\theta x + \sin\theta y - c_x\cos\theta - c_y\sin\theta + c_x \\ -\sin\theta x + \cos\theta y + c_x\sin\theta - c_y\cos\theta + c_y \\ \end{pmatrix} \\ =& \begin{pmatrix} \cos\theta & \sin\theta & (1 - \cos\theta)c_x - c_y\sin\theta \\ -\sin\theta & \cos\theta & c_x\sin\theta + (1-\cos\theta)c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} \end{aligned} (xy)===(cosθsinθsinθcosθ)(xcxycy)+(cxcy)(cosθx+sinθycxcosθcysinθ+cxsinθx+cosθy+cxsinθcycosθ+cy)(cosθsinθsinθcosθ(1cosθ)cxcysinθcxsinθ+(1cosθ)cy) xy1

现在再考虑缩放,分2种情况:

(1) 旋转后以原点为中心缩放 scale, 记 s c a l e ∗ cos ⁡ θ = α scale * \cos \theta = \alpha scalecosθ=α ,
s c a l e ∗ sin ⁡ θ = β scale * \sin \theta = \beta scalesinθ=β ,则
( x ′ y ′ ) = ( s c a l e 0 0 s c a l e ) ( cos ⁡ θ sin ⁡ θ ( 1 − cos ⁡ θ ) c x − c y sin ⁡ θ − sin ⁡ θ cos ⁡ θ c x sin ⁡ θ + ( 1 − cos ⁡ θ ) c y ) ( x y 1 ) = ( α β ( s c a l e − α ) c x − β c y − β α β c x + ( s c a l e − α ) c y ) ( x y 1 ) \begin{aligned} \begin{pmatrix} x'\\ y'\\ \end{pmatrix} =& \begin{pmatrix} scale & 0\\ 0 & scale \end{pmatrix} \begin{pmatrix} \cos\theta & \sin\theta & (1 - \cos\theta)c_x - c_y\sin\theta \\ -\sin\theta & \cos\theta & c_x\sin\theta + (1-\cos\theta)c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} \\ =& \begin{pmatrix} \alpha & \beta & (scale - \alpha)c_x - \beta c_y \\ -\beta & \alpha & \beta c_x + (scale-\alpha)c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} \end{aligned} (xy)==(scale00scale)(cosθsinθsinθcosθ(1cosθ)cxcysinθcxsinθ+(1cosθ)cy) xy1 (αββα(scaleα)cxβcyβcx+(scaleα)cy) xy1

(2) 旋转后以 ( c x , c y ) (c_x, c_y) (cx,cy) 为中心点缩放,分2步:
第1步,先按上面(1)变换,此时 ( c x , c y ) (c_x, c_y) (cx,cy)点变为了 ( s c a l e ∗ c x , s c a l e ∗ c y ) (scale * c_x, scale * c_y) (scalecx,scalecy)
;第2步 x分量平移 c x − s c a l e ∗ c x c_x - scale * c_x cxscalecx ,y
分量平移 c y − s c a l e ∗ c y c_y - scale * c_y cyscalecy。因此

( x ′ y ′ ) = ( α β ( s c a l e − α ) c x − β c y − β α β c x + ( s c a l e − α ) c y ) ( x y 1 ) + ( 0 0 c x − s c a l e ∗ c x 0 0 c y − s c a l e ∗ c y ) ( x y 1 ) = ( α β ( 1 − α ) c x − β c y − β α β c x + ( 1 − α ) c y ) ( x y 1 ) \begin{aligned} \begin{pmatrix} x'\\ y'\\ \end{pmatrix} =& \begin{pmatrix} \alpha & \beta & (scale - \alpha)c_x - \beta c_y \\ -\beta & \alpha & \beta c_x + (scale-\alpha)c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} + \begin{pmatrix} 0 & 0 & c_x - scale * c_x \\ 0 & 0 & c_y - scale * c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} \\ =& \begin{pmatrix} \alpha & \beta & (1 - \alpha)c_x - \beta c_y \\ -\beta & \alpha & \beta c_x + (1-\alpha)c_y \\ \end{pmatrix} \begin{pmatrix} x\\ y\\ 1\\ \end{pmatrix} \end{aligned} (xy)==(αββα(scaleα)cxβcyβcx+(scaleα)cy) xy1 +(0000cxscalecxcyscalecy) xy1 (αββα(1α)cxβcyβcx+(1α)cy) xy1

顺便提下,毛星云写的《OpenCV3 编程入门》旋转缩放矩阵是错的,写成了2*1矩阵;《学习OpenCV 3》中文版则有一个符号错误,把加号写成了减号。这2本书都没有推导过程,这也是我写这篇文章的原因。

原文链接
仿射变换中的旋转缩放变换矩阵推导

欢迎关注我的微信公众号[数学345]:长按"识别图中二维码";或打开微信扫一扫。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值