cv2技术原理-图像旋转原理及手动实现
- 1、图像旋转opencv实现
- 2、cv2.getRotationMatrix2D函数解释
- 3、数学原理推导旋转矩阵M
- 4、手动计算旋转矩阵M
- 5、旋转矩阵M的使用
- 6、使用旋转矩阵M手动实现旋转功能
1、图像旋转opencv实现
图像旋转在对数据集数据增强(主要是随机以任意角度进行旋转)方面用途很广,是仿射变换的一种。
import numpy as np
import matplotlib.pyplot as plt
import cv2
path = "5a1672eb1027c.jpg"
img = cv2.imread(path)
def show_img(img):plt.figure(figsize=(10, 10))plt.imshow(img[:,:,::-1])plt.axis('off')plt.show()
# 获得旋转变换矩阵
M = cv2.getRotationMatrix2D((int(width/2), int(height/2)), 10, 1.0)
# 旋转变换
out_img = cv2.warpAffine(img, M, (width,height))
show_img(out_img)
print(M)
变换矩阵M的值
2、cv2.getRotationMatrix2D函数解释
接受三个参数 (x, y), angle, scale
第一个参数旋转中心,第二个参数旋转角度(正数表示逆时针),第三个参数:缩放比例
3、数学原理推导旋转矩阵M
推导过程
不改变坐标原点的位置和单位长度,只改变坐标轴方向的坐标系的变换,叫做坐标轴的旋转.
设点M在原坐标系中的坐标为(x,y),对应向量的模为r,幅角为α.将坐标轴绕坐标原点,按照逆时针方向旋转角θ形成新坐标系,点M在新坐标系中的坐标为(如图2-4),则
对于图像中的点
可以列出一下等式
可得矩阵M
在opencv中,负数表示的是逆时针。
也可以是以下形式,注意旋转方向与正负的关系即可。
4、手动计算旋转矩阵M
from math import *
def M_manual(center,a):a = a/180*pix,y = centerM_ = np.array([[cos(a),sin(a),(1-cos(a))*x-sin(a)*y],[-sin(a),cos(a),(1-cos(a))*y+sin(a)*x]])return M_
mat_trans = M_manual((int(width/2), int(height/2)),10)
mat_trans
输出结果与opencv一致。
5、旋转矩阵M的使用
目标点坐标可以根据M矩阵计算得出。公式如下
6、使用旋转矩阵M手动实现旋转功能
out_img = np.zeros(img.shape,dtype=np.uint8)
# print(height,width,out_img.shape)
# mat_trans@np.array([[height],[width],[1]])
for i in range(width):for j in range(height):# print(imgs[i,j,:])ori = np.array([[i],[j],[1]])dst = np.dot(mat_trans,ori).astype(int)if dst[1][0]>=height or dst[1][0]<0:continueif dst[0][0]>=width or dst[0][0]<0:continueout_img[dst[1][0],dst[0][0],:] = img[j,i,:]
imgs = np.hstack([out_img,img])
show_img(out_img)
与opencv结果一致,说明实现正确。
粗浅理解,如有问题,请批评指正。
感谢参考文献的作者。
参考:
图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)