我生成一个随机噪声图像,如下所示。
image_shape = (299, 299, 3)
image = np.random.uniform(size=image_shape) + 128.0
我需要少量旋转此图像(-25到+25度)。我目前正在使用scipy.ndimage.rotate,但这会导致图像变成白色。使用np.rot90旋转ndarray工作正常,但我不能像这样旋转图像,因为我只需要使用小角度。
plot_image(image)
plot_image(np.rot90(image))
plot_image(rotate(image, 5))
上面的代码产生以下输出:
答案 0 :(得分:2)
在原始问题中的行:
image = np.random.uniform(size=image_shape) + 128.0
创建一个像素值都在 128 到 129 之间的图像。然后可视化自动缩放这些值之间的颜色图。旋转后,角点出现值为 0 的像素。自动缩放然后映射 0 到 129 之间的颜色比例,从而提供黑白方面。
答案 1 :(得分:-1)
我使用opencv执行此操作,以下代码假设您希望围绕其中心顺时针旋转它:
import numpy as np
import cv2
def rotate(img, angle):
img = cv2.imread(img)
(height, width) = img.shape[:2]
(cent_x, cent_y) = (width // 2, height // 2)
mat = cv2.getRotationMatrix2D((cent_x, cent_y), -angle, 1.0)
cos = np.abs(mat[0, 0])
sin = np.abs(mat[0, 1])
n_width = int((height * sin) + (width * cos))
n_height = int((height * cos) + (width * sin))
mat[0, 2] += (n_width / 2) - cent_x
mat[1, 2] += (n_height / 2) - cent_y
return cv2.warpAffine(img, mat, (n_width, n_height))
Lemme知道一切运作良好!
PS:如果您对使用Python代码操纵图像感兴趣,我强烈建议您关注Adrian Rosebrock的博客。
答案 2 :(得分:-1)
我会创建一个函数,将输入图像中的每个像素映射到相应的旋转图像。 确保相对于中心像素旋转(如果这确实是您正在寻找的旋转)
(rows, cols) = img.shape
mid_coords = np.floor(0.5*np.array(img.shape))
def rotate_pixel(pixel_coords, cos_angle, sin_angle):
x = mid_coords[0] + (pixel_coords[0] - mid_coords[0]) * cos_angle
y = mid_coords[1] + (pixel_coords[1] - mid_coords[1]) * sin_angle
if 0<=x<rows and 0<=y<cols:
return (x,y)
else:
return False
rotated_img = np.zeros((rows, cols))
cos_angle = np.cos(angle)
sin_angle = np.sin(angle)
for i in range(rows):
for k in range(cols):
coords = rotate_pixel((i,k), cos_angle, sin_angle)
if(coords):
rotated_img[coords] = img[i][k]