Python基于旋转矩阵实现图像逆时针旋转时出现顺时针旋转问题
问题根因
你得到顺时针旋转结果而非预期的逆时针旋转,核心是两个问题叠加导致的:
- 混淆了数学标准坐标系与图像存储坐标系的轴向差异:数学中常用右手坐标系y轴向上,逆时针旋转的标准矩阵为
但NumPy存储图像时,数组第一维(高度方向)索引0对应图像最顶部,索引越大位置越靠下,也就是y轴方向和数学坐标系完全相反,直接套用标准旋转矩阵会天然反转旋转方向。x' = x·cosθ - y·sinθ y' = x·sinθ + y·cosθ - 代码中添加了多余的双重坐标翻转逻辑:计算原图像素相对中心坐标时做了
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
相关产品推荐
相关产品推荐

