Python实现图像绕中心旋转 |
您所在的位置:网站首页 › 30度的角度图片 › Python实现图像绕中心旋转 |
公式摘自《数字图像处理及Matlab实现》杨杰版 设初始图像上的点为A0(x0,y0),旋转β角后的点为A(x,y),为方便表示采用极坐标,初始角度为α,如下图: 因为要绕中心点旋转,所以要将坐标进行平移。 如果是被裁剪过的效果,那么目标边界大小就为原始图像大小。 如果直接由原图来计算出目标图像,则会因为坐标点在旋转过程中出现小数,使有些点的没有被映射到,产生的图片有很多“黑点”。 所以我这里采用反向旋转,计算出目标点在原图上的位置,此时原图坐标也会有小数情况,所以对其进行了双线性内插值。 插值算法参考了这篇文章 图像几何变换(缩放、旋转)中的常用的插值算法 整体代码如下: import numpy as np from PIL import Image import matplotlib.pyplot as plt import pylab from skimage import data,color,transform import math def imrotate(image, b, crop): b = -math.radians(b % 360) # 将角度化为弧度 n = np.size(image, 0) m = np.size(image, 1) center = (n/2.0, m/2.0) img = np.zeros((n, m)) # 不裁剪 if not crop: # 计算图幅 xx = [] yy = [] for x0, y0 in ((0, 0), (n, 0), (n, m), (0, m)): x = (x0 - center[0]) * math.cos(b) + (y0 - center[1]) * math.sin(b) y = -1*(x0 - center[0]) * math.sin(b) + (y0 - center[1]) * math.cos(b) xx.append(x) yy.append(y) nn = int(math.ceil(max(xx)) - math.floor(min(xx))) nm = int(math.ceil(max(yy)) - math.floor(min(yy))) img = np.zeros((nn, nm)) center = (nn/2, nm/2) # 裁剪 if crop: nn = n nm = m def inmap(x, y): return True if x >= 0 and x = 0 and y |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |