You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python基于旋转矩阵实现图像逆时针旋转时出现顺时针旋转问题

问题根因

你得到顺时针旋转结果而非预期的逆时针旋转,核心是两个问题叠加导致的:

  • 混淆了数学标准坐标系与图像存储坐标系的轴向差异:数学中常用右手坐标系y轴向上,逆时针旋转的标准矩阵为
    x' = x·cosθ - y·sinθ
    y' = x·sinθ + y·cosθ
    
    但NumPy存储图像时,数组第一维(高度方向)索引0对应图像最顶部,索引越大位置越靠下,也就是y轴方向和数学坐标系完全相反,直接套用标准旋转矩阵会天然反转旋转方向。
  • 代码中添加了多余的双重坐标翻转逻辑:计算原图像素相对中心坐标时做了Im.shape[0]-1-i、Im.shape[1]-1-j的翻转,映射到新图像坐标时又做了new_centre_height-new_y0、new_centre_width-new_x0的二次翻转,两次翻转配合旋转矩阵的符号,最终把旋转方向完全反转成了顺时针。

额外说明:你当前用的前向映射逻辑(遍历原图像素找新图位置)还会导致新图出现空洞、锯齿问题,但这不是旋转方向错误的诱因。

修正方案

删除多余的坐标翻转逻辑,针对图像y轴向下的特性调整旋转矩阵参数即可,修改对应代码段为:

for i in range(height):
    for j in range(width):
        # 计算原图像素相对于原图中心的坐标:x向右为正,y向下为正
        y0 = i - original_centre_height
        x0 = j - original_centre_width

        # 适配图像坐标系的逆时针旋转变换
        new_y0 = round(-x0 * sine + y0 * cosine)
        new_x0 = round(x0 * cosine + y0 * sine)

        # 转换为新图像的数组索引坐标,无需额外取反
        new_y0 = new_centre_height + new_y0
        new_x0 = new_centre_width + new_x0

        if 0 <= new_x0 < new_width and 0 <= new_y0 < new_height:
            Rot_Im[new_y0,new_x0,:] = Im[i,j,:]

修改后运行即可得到正确的逆时针30度旋转效果。

内容的提问来源于stack exchange,提问作者Kevin Putra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:39:19