## python实现图像仿射变换 以图像缩放并平移为例讲解

请参考：图解图像仿射变换：https://www.cnblogs.com/wojianxin/p/12518393.html

要实现其他功能的仿射变换，请读者照葫芦画瓢，自行举一反三：

 1 import cv2
2 import numpy as np
3
4 # Affine Transformation
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 new image shape
14     H_new = np.round(H * d).astype(np.int)
15     W_new = np.round(W * a).astype(np.int)
16     out = np.zeros((H_new+1, W_new+1, 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     x = np.minimum(np.maximum(x, 0), W+1).astype(np.int)
28     y = np.minimum(np.maximum(y, 0), H+1).astype(np.int)
29
30     # assgin pixcel to new image
31     out[y_new, x_new] = img[y, x]
32
33     out = out[:H_new, :W_new]
34     out = out.astype(np.uint8)
35
36     return out
37
40 # Affine
41 out = affine(image, a=1.5, b=0, c=0, d=0.6, tx=-30, ty=100)
42 # Save result
43 cv2.imshow("result", out)
44 cv2.imwrite("out.jpg", out)
45 cv2.waitKey(0)
46 cv2.destroyAllWindows()

未经作者允许，请勿随意转载抄袭，抄袭情节严重者，作者将考虑追究其法律责任，创作不易，感谢您的理解和配合！

posted on 2020-03-18 20:45  我坚信阳光灿烂  阅读(971)  评论(0编辑  收藏  举报