一. 实验代码
实验目标:实现输入图像绕中心点逆时针旋转30度
1 import cv2 2 import numpy as np 3 4 # affine transformation -> rotation 5 def affine(img, a, b, c, d, tx, ty): 6 H, W, C = img.shape 7 8 # temporary image 9 tem = img.copy() 10 img = np.zeros((H+2, W+2, C), dtype=np.float32) 11 img[1:H+1, 1:W+1] = tem 12 13 # get shape of new image 14 H_new = np.round(H).astype(np.int) 15 W_new = np.round(W).astype(np.int) 16 out = np.zeros((H_new, W_new, C), dtype=np.float32) 17 18 # get position of new image 19 x_new = np.tile(np.arange(W_new), (H_new, 1)) 20 y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1) 21 22 # get position of original image by affine 23 adbc = a * d - b * c 24 x = np.round((d * x_new - b * y_new) / adbc).astype(np.int) - tx + 1 25 y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1 26 27 # adjust center by affine 28 dcx = (x.max() + x.min()) // 2 - W//2 29 dcy = (y.max() + y.min()) // 2 - H//2 30 31 x -= dcx 32 y -= dcy 33 34 x = np.clip(x, 0, W + 1) 35 y = np.clip(y, 0, H + 1) 36 37 # assign pixcel 38 out[y_new, x_new] = img[y, x] 39 out = out.astype(np.uint8) 40 41 return out 42 43 # Read image 44 img = cv2.imread("../paojie.jpg").astype(np.float32) 45 46 # Affine 47 A = 30. 48 theta = - np.pi * A / 180. 49 50 out = affine(img, a=np.cos(theta), b=-np.sin(theta), c=np.sin(theta), d=np.cos(theta), 51 tx=0, ty=0) 52 53 # Save result 54 cv2.imshow("result", out) 55 cv2.imwrite("out.jpg", out) 56 cv2.waitKey(0) 57 cv2.destroyAllWindows()
二. 实验结果:
![](https://upload-images.jianshu.io/upload_images/17221499-ef00c7d4dee6d929.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
原图 ↑
![](https://upload-images.jianshu.io/upload_images/17221499-22401e69055125b4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
逆时针旋转30度图像 ↑
三. 实验难点突破:
https://www.cnblogs.com/wojianxin/p/12519498.html
https://www.jianshu.com/p/1cfb3fac3798
四. 图像仿射变换简介: