图像旋转本质是坐标变换,通过数学变换重排二维或三维数组中像素位置;90°顺时针旋转可由上下翻转加转置实现,任意角度需仿射变换与双线性插值。

图像旋转本质上是坐标变换,多维数组(如二维数组)恰好能模拟像素矩阵,通过数学变换重新排列元素即可实现旋转效果。
理解图像在数组中的存储结构
一张灰度图可表示为 m × n 的二维数组,每个元素代表一个像素值(如0–255)。彩色图则是三维数组:m × n × 3(分别对应R、G、B通道)。旋转操作不改变像素值,只改变它们在数组中的位置索引。
实现90度顺时针旋转(最常用场景)
对于尺寸为 m × n 的图像数组,90°顺时针旋转后变为 n × m。新坐标与原坐标满足关系:
new[i][j] = original[m−1−j][i]
- 先对原数组按行逆序(上下翻转)
- 再沿主对角线转置(行列互换)
- 或直接双层循环,按公式逐个赋值,避免额外空间开销
支持任意角度的仿射变换思路
非90°倍数的旋转(如30°、45°)需用仿射变换,核心是:
- 以图像中心为原点建立坐标系
- 对每个目标位置 (x', y'),反向计算其在原图中对应坐标 (x, y):
x = x'·cosθ + y'·sinθ + cx(1−cosθ) − cy·sinθ
y = −x'·sinθ + y'·cosθ + cx·sinθ + cy(1−cosθ) - 使用双线性插值估算该坐标处的像素值(因结果常落在非整数位置)
注意事项与优化建议
直接操作原始数组易出错,推荐:
- 旋转前复制数组,避免覆盖原始数据
- 预分配目标数组尺寸,防止动态扩容影响性能
- 对大图像优先用NumPy等库(
np.rot90()或cv2.warpAffine()),底层已高度优化 - 注意边界处理:旋转后可能出现空隙,常用填充策略包括补黑(0)、补白(255)或镜像延拓











