这是填坑篇,之前写的图片旋转程序把图片变成了桌布,几个世纪后,在一个月黑风高的夜晚,我灵光乍现,何不试试双线性插值?
先上代码和效果图。
1 #!/usr/bin/env python3
2 #-*-coding:utf-8-*-
3 """
4 双线性插值参考资料: 双线性插值原理及Python实现 - Jinglever https://www.jianshu.com/p/29e5c84ea5395
6 如果出现错误:...If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config7 执行 pip3 install opencv-contrib-python8 """
9 importnumpy as np10 #np.set_printoptions(suppress=True) # 关闭科学计数法
11 importcv212 importos13
14
15 #旋转矩阵R
16 ANGLE = 30 #(dim=°)
17 assert 0 < ANGLE < 90 #目前限制这个旋转范围,原因是y1, y2, y3, y4上下关系根据角度变化
18 alpha = ANGLE/360*2*np.pi19 R_rev = np.matrix([[np.cos(alpha), np.sin(alpha)], #逆向映射推导的旋转矩阵
20 [-np.sin(alpha), np.cos(alpha)]])21 print(R_rev)22
23 #重设图片大小
24 WIDTH, HEIGHT = 640, 480
25
26 img = cv2.imread("timg.jpg")27 img =cv2.resize(img, (WIDTH, HEIGHT))28 #img_gray = np.float32(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
29 img =np.float32(img)30 print(img.shape)31
32 #假设已经得到旋转后的图片,利用图片边框画出图片的矩形,在矩形内遍历坐标就是图片各个像素点的坐标
33 #注意旋转角度超过90度后边框线的上下关系会发生变化,待改进……
34 x = np.arange(np.abs(WIDTH*np.cos(alpha)) + np.abs(HEIGHT*np.sin(alpha)), dtype=np.int32)35 y1 = lambda x: (- x*np.tan(alpha)).astype(np.int32)36 y2 = lambda x: (y1(x) + HEIGHT/np.cos(alpha)).astype(np.int32)37 y3 = lambda x: (x/np.tan(alpha)).astype(np.int32)38 y4 = lambda x: (y3(x) - WIDTH/np.sin(alpha)).as