矩阵旋转,仿射变换

Posted xiaoxu-xli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵旋转,仿射变换相关的知识,希望对你有一定的参考价值。

import numpy as np
import math as m
  
def Rx(theta):
  return np.matrix([[ 1, 0           , 0           ],
                   [ 0, m.cos(theta),-m.sin(theta)],
                   [ 0, m.sin(theta), m.cos(theta)]])
  
def Ry(theta):
  return np.matrix([[ m.cos(theta), 0, m.sin(theta)],
                   [ 0           , 1, 0           ],
                   [-m.sin(theta), 0, m.cos(theta)]])
  
def Rz(theta):
  return np.matrix([[ m.cos(theta), -m.sin(theta), 0 ],
                   [ m.sin(theta), m.cos(theta) , 0 ],
                   [ 0           , 0            , 1 ]])

phi = m.pi/2
theta = m.pi/4
psi = m.pi/2
print("phi =", phi)
print("theta  =", theta)
print("psi =", psi)
  
  
R = Rz(psi) * Ry(theta) * Rx(phi)
print(np.round(R, decimals=2))

eul1 = m.atan2(R.item(1,2),R.item(0,2))
sp = m.sin(eul1)
cp = m.cos(eul1)
eul2 = m.atan2(cp*R.item(0,2)+sp*R.item(1,2), R.item(2,2))
eul3 = m.atan2(-sp*R.item(0,0)+cp*R.item(1,0),-sp*R.item(0,1)+cp*R.item(1,1))
  
print("phi =", eul1)
print("theta =", eul2)
print("psi =", eul3)

参考:
[1] https://en.wikipedia.org/wiki/Transformation_matrix#Examples_in_3D_computer_graphics
[2] https://www.brainvoyager.com/bv/doc/UsersGuide/CoordsAndTransforms/SpatialTransformationMatrices.html
[3] https://people.computing.clemson.edu/~dhouse/courses/401/notes/affines-matrices.pdf
[4] https://blog.csdn.net/shenquanyue/article/details/103262512
[5] https://zhuanlan.zhihu.com/p/64458650
[6] https://www.meccanismocomplesso.org/en/3d-rotations-and-euler-angles-in-python/
[7] https://www.symbolab.com/solver/matrix-multiply-calculator

opencv 图像平移缩放旋转翻转 图像仿射变换

图像几何变换

图像几何变换从原理上看主要包括两种:基于2x3矩阵的仿射变换(平移、缩放、旋转、翻转)、基于3x3矩阵的透视变换。

图像平移

opencv实现图像平移

实现图像平移,我们需要定义下面这样一个矩阵,tx和ty分别是x和y方向上平移的距离:
技术图片
图像平移利用仿射变换函数 cv.warpAffine() 实现

实验

# 图像平移
import numpy as np
import cv2 as cv

img = cv.imread(‘paojie.jpg‘)

rows, cols = img.shape[:2]

# 定义平移矩阵,需要是numpy的float32类型
# x轴平移100,y轴平移50
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射变换实现平移,第三个参数为dst的大小
dst = cv.warpAffine(img, M, (cols, rows))

cv.imshow(‘shift‘, dst)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

技术图片

图像缩放

opencv中的图像缩放

缩放就是调整图片的大小,使用cv.resize()函数实现图像缩放。可以按照比例缩放,也可以按照指定的大小缩放。

实验

# 图像缩放
import numpy as np
import cv2 as cv

img = cv.imread(‘paojie.jpg‘)

# 按照指定的宽度、高度缩放图片
res = cv.resize(img, (132, 150))
# 按照比例缩放,如x,y方向均放大一倍
# res2 = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)

cv.imshow(‘shrink‘, res)
# cv.imshow(‘zoom‘, res2)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

技术图片

各种interpolation方式

参考:各种插值方法介绍

图像旋转

简介

旋转同平移一样,也是用仿射变换实现的,因此也需要定义一个变换矩阵。OpenCV直接提供了 cv.getRotationMatrix2D()函数来生成这个矩阵,该函数有三个参数:
参数1:图片的旋转中心
参数2:旋转角度(正:逆时针,负:顺时针)
参数3:缩放比例,0.5表示缩小一半

实验

# 图像旋转
import numpy as np
import cv2 as cv

img = cv.imread(‘paojie.jpg‘)
rows,cols = img.shape[:2]

# 逆时针45°旋转图片并缩小一半,第一个参数为旋转中心
M = cv.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5)
# img:源图像;M:旋转仿射矩阵;(cols,rows):dst的大小
dst = cv.warpAffine(img, M, (cols, rows))

cv.imshow(‘rotation‘, dst)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

技术图片

图像翻转

opencv中的图像翻转

dst = cv2.flip(img, 1)
其中,函数中的第二个参数大于0,表示图像水平翻转(沿y轴);第二个参数等于0,表示图像垂直翻转(沿x轴);第二个参数小于0,表示图像既水平翻转,又垂直翻转。

实验

# 图像翻转
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(‘paojie.jpg‘)

# 水平翻转
hor = cv.flip(img,1)
# 垂直翻转
ver = cv.flip(img,0)
# 水平垂直翻转
hor_ver = cv.flip(img,-1)

plt.figure(1)
plt.subplot(2,2,1)
plt.imshow(img)
plt.title(‘Original‘)
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,2)
plt.imshow(hor)
plt.title(‘horizontal‘)
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,3)
plt.imshow(ver)
plt.title(‘vertical‘)
plt.xticks([]),plt.yticks([])

plt.subplot(2,2,4)
plt.imshow(hor_ver)
plt.title(‘horizontal_and_vertical‘)
plt.xticks([]),plt.yticks([])

plt.show()

实验结果

技术图片
看完了整篇文章,不点个赞放松一下。

以上是关于矩阵旋转,仿射变换的主要内容,如果未能解决你的问题,请参考以下文章

矩阵旋转,仿射变换

生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转

生成组合仿射变换矩阵,裁剪+缩放+平移+斜切+旋转

opencv 图像平移缩放旋转翻转 图像仿射变换

opencv 图像变换原理详解 图像平移 图像旋转 图像缩放

【转】仿射变换及其变换矩阵的理解