如何在不使用 cv2.getRotationMatrix2D 的情况下手动旋转图像

Pat*_*ick 2 python opencv

我想在不使用内置 cv2 库的情况下旋转图像。所以我看到了这个方程

但我不知道如何将其应用到我的代码中。

//编辑

unl*_*lut 5

这通常是通过迭代输出图像像素并找到它对应的输入图像像素,使用旋转矩阵进行逆旋转来完成的。以下代码的一些注释和改进:
1- 使用偏移是因为我相对于中心位置旋转图像(想象用笔握住图像的中心并旋转它)而不是其左上角位置。
2-我创建了最大可能输出尺寸的图像,更好的方法是根据输入图像尺寸和旋转量计算必要的输出尺寸。
3- 正如代码中所述,在确定输出图像中的像素值时,最好使用最近的 4 个输入图像像素进行线性插值,而不是匹配输入图像中的单个像素。

import numpy as np
import math
from scipy import ndimage
from PIL import Image


#  inputs
img = ndimage.imread("A.png")
rotation_amount_degree = 45

#  convert rotation amount to radian
rotation_amount_rad = rotation_amount_degree * np.pi / 180.0


#  get dimension info
height, width, num_channels = img.shape


#  create output image, for worst case size (45 degree)
max_len = int(math.sqrt(height*height + width*width))
rotated_image = np.zeros((max_len, max_len, num_channels))
#rotated_image = np.zeros((img.shape))


rotated_height, rotated_width, _ = rotated_image.shape
mid_row = int( (rotated_height+1)/2 )
mid_col = int( (rotated_width+1)/2 )

#  for each pixel in output image, find which pixel
#it corresponds to in the input image
for r in range(rotated_height):
    for c in range(rotated_width):
        #  apply rotation matrix, the other way
        y = (r-mid_col)*math.cos(rotation_amount_rad) + (c-mid_row)*math.sin(rotation_amount_rad)
        x = -(r-mid_col)*math.sin(rotation_amount_rad) + (c-mid_row)*math.cos(rotation_amount_rad)

        #  add offset
        y += mid_col
        x += mid_row

        #  get nearest index
        #a better way is linear interpolation
        x = round(x)
        y = round(y)

        #print(r, " ", c, " corresponds to-> " , y, " ", x)

        #  check if x/y corresponds to a valid pixel in input image
        if (x >= 0 and y >= 0 and x < width and y < height):
            rotated_image[r][c][:] = img[y][x][:]


#  save output image
output_image = Image.fromarray(rotated_image.astype("uint8"))
output_image.save("rotated_image.png")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述
在此输入图像描述