我在PIL python库中遇到了im.transform方法的问题。我想我弄清了参数A到F的逻辑,然而,尽管波纹管函数计算出的所有四个角都有正确的正值,但是得到的图像会以错误的方向旋转并被切断。
有没有人能给我公式来计算两个坐标系中三个相同点的仿射参数(A到F)?
def tran (x_pic, y_pic, A, B, C, D, E, F):
X = A * x_pic + B * y_pic + C
Y = D * x_pic + E * y_pic + F
return X, Y
答案 0 :(得分:9)
转换对我来说很好。作为一个例子,我们将围绕一个不同于(0,0)的中心旋转图像,并可选择缩放和平移到新的中心。以下是使用transform进行的操作:
def ScaleRotateTranslate(image, angle, center = None, new_center = None, scale = None,expand=False):
if center is None:
return image.rotate(angle)
angle = -angle/180.0*math.pi
nx,ny = x,y = center
sx=sy=1.0
if new_center:
(nx,ny) = new_center
if scale:
(sx,sy) = scale
cosine = math.cos(angle)
sine = math.sin(angle)
a = cosine/sx
b = sine/sx
c = x-nx*a-ny*b
d = -sine/sy
e = cosine/sy
f = y-nx*d-ny*e
return image.transform(image.size, Image.AFFINE, (a,b,c,d,e,f), resample=Image.BICUBIC)
希望有所帮助。如果没有,请告诉我。
干杯,菲利普。
答案 1 :(得分:0)
我认为我的版本更加明确和易于理解
def scale_rotate_translate(image, angle, sr_center=None, displacment=None, scale=None):
if sr_center is None:
sr_center = 0, 0
if displacment is None:
displacment = 0, 0
if scale is None:
scale = 1, 1
angle = -angle / 180.0 * np.pi
C = np.array([[1, 0, -sr_center[0]],
[0, 1, -sr_center[1]],
[0, 0, 1]])
C_1 = np.linalg.inv(C)
S = np.array([[scale[0], 0, 0],
[0, scale[1], 0],
[0, 0, 1]])
R = np.array([[np.cos(angle), np.sin(angle), 0],
[-np.sin(angle), np.cos(angle), 0],
[0, 0, 1]])
D = np.array([[1, 0, displacment[0]],
[0, 1, displacment[1]],
[0, 0, 1]])
Mt = np.dot(D, np.dot(C_1, np.dot(R, np.dot(S, C))))
a, b, c = Mt[0]
d, e, f = Mt[1]
return image.transform(image.size, Image.AFFINE, (a, b, c, d, e, f), resample=Image.BICUBIC)