[英]Rotate Image in Affine Transformation
我无法在仿射变换中正确旋转图像。 目前以下是我正在使用的:
rotation_matrix = np.array([[np.cos(rotation_angle),
-np.sin(rotation_angle),0],
[np.sin(rotation_angle),
np.cos(rotation_angle),0],
[0,0,1]])
如果我将角度设置为大于约50度的任何角度,我会得到一个完整的黑色图像而没有任何内容(我将新图像设置为完全黑色,这表示没有任何已翻译的像素落在新图像的范围内) 。 如果我旋转小于50度,我得到图像的一部分,但它看起来不正确旋转我可以告诉。 此外,原点0,0位于左上角。 如果图像旋转到原始图像的边界之外,我希望图像的一部分被遮挡。
在应用旋转之前,我正在采用反向通道
#get inverse of transform matrix
inverse_transform_matrix = np.linalg.inv(multiplied_matrices)
轮换发生的地方:
def Apply_Matrix_To_Image(matrix_to_apply, image_map):
#takes an image and matrices and applies it.
x_min = 0
y_min = 0
x_max = image_map.shape[0]
y_max = image_map.shape[1]
new_image_map = np.zeros((x_max, y_max), dtype=int)
for y_counter in range(0, y_max):
for x_counter in range(0, x_max):
curr_pixel = [x_counter,y_counter,1]
curr_pixel = np.dot(matrix_to_apply, curr_pixel)
print(curr_pixel)
if curr_pixel[0] > x_max - 1 or curr_pixel[1] > y_max - 1 or x_min > curr_pixel[0] or y_min > curr_pixel[1]:
next
else:
new_image_map[x_counter][y_counter] = image_map[int(curr_pixel[0])][int(curr_pixel[1])]
return new_image_map
# tested with python3
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def GetRotateMatrixWithCenter(x, y, angle):
# https://math.stackexchange.com/questions/2093314
move_matrix = np.array(
[
[1, 0, x],
[0, 1, y],
[0, 0, 1]
])
rotation_matrix = np.array(
[
[np.cos(angle), -np.sin(angle), 0],
[np.sin(angle), np.cos(angle), 0],
[0, 0, 1]
])
back_matrix = np.array(
[
[1, 0, -x],
[0, 1, -y],
[0, 0, 1]
])
r = np.dot(move_matrix, rotation_matrix)
return np.dot(r, back_matrix)
def Apply_Matrix_To_Image(matrix_to_apply, image_map):
#takes an image and matrices and applies it.
x_min = 0
y_min = 0
x_max = image_map.shape[0]
y_max = image_map.shape[1]
new_image_map = np.zeros((x_max, y_max), dtype=int)
for y_counter in range(0, y_max):
for x_counter in range(0, x_max):
curr_pixel = [x_counter,y_counter,1]
curr_pixel = np.dot(matrix_to_apply, curr_pixel)
# print(curr_pixel)
if curr_pixel[0] > x_max - 1 or curr_pixel[1] > y_max - 1 or x_min > curr_pixel[0] or y_min > curr_pixel[1]:
next
else:
new_image_map[x_counter][y_counter] = image_map[int(curr_pixel[0])][int(curr_pixel[1])]
return new_image_map
# convert image to grayscale
img = Image.open('small.png').convert("L")
img = np.asarray(img)
image_width = img.shape[0]
image_height = img.shape[1]
plt.subplot(1,2,1)
plt.title('Origin image')
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.subplot(1,2,2)
plt.title('Transformed image')
alpha = 0
while True:
rotation_angle = 0 + alpha
alpha = alpha + 1 # increate 1 degree
rotation_angle = np.deg2rad(rotation_angle) # degree to radian
rotation_matrix = GetRotateMatrixWithCenter(image_width / 2, image_height / 2, rotation_angle)
roteated = Apply_Matrix_To_Image(rotation_matrix, img)
plt.imshow(roteated, cmap='gray', vmin=0, vmax=255)
plt.pause(0.001)
plt.show()
更新内容:
np.deg2rad()
将Degree转换为弧度 运行屏幕:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.