np.rot90默认逆时针转90°,三维图像须显式指定axes=(0,1)防通道错乱;k=-1为顺时针90°;仅重排索引不插值,shape维度交换需动态适配。

rot90函数怎么用才不转错方向
np.rot90 默认逆时针转 90°,但图像处理中常需顺时针——这容易被忽略。它接受 k 参数控制旋转次数(正数为逆时针,负数为顺时针),axes 指定哪两个轴参与旋转。对标准图像数组(H×W×C 或 H×W),必须显式传 axes=(0, 1),否则在三维数组上可能误绕通道轴转,导致颜色错乱。
- 图像矩阵是二维(如灰度图):直接调用
np.rot90(img, k=1)即可 - 图像是三维(如 RGB,形状为
(h, w, 3)):必须写np.rot90(img, k=1, axes=(0, 1)),否则默认axes=(0, 2),会把 R/G/B 当成空间维度乱转 -
k=-1等价于顺时针 90°,比k=3更直观,也避免整数溢出风险(虽然实际极少发生) -
k支持任意整数,k=2是 180°,k=4回原样,但别依赖k=4做恒等判断——浮点数组可能因内存布局微变引发==失败
rot90和imageio/PIL旋转结果不一致?
np.rot90 是纯数组变换,不做插值、不重采样、不补边,只重排元素索引;而 imageio 或 PIL.Image.rotate 默认双线性插值 + 黑色填充,结果视觉上“更平滑”,数值上却完全不同。这不是 bug,是设计目标差异。
- 若你用
imageio.imread读图得到uint8数组,再用np.rot90,结果仍是uint8,像素值严格保真 - 但
PIL.Image.rotate(90)返回新图像,内部转 float 再插值,再转回 uint8,会有舍入误差和边缘模糊 - 要复现 PIL 的 90° 整倍数旋转效果,
np.rot90完全够用且更快;想转任意角度(如 15.5°),就得换插值方案,np.rot90不适用 - 注意:
np.rot90不改变数组 dtype,若原图是float32,输出也是float32,不会自动截断
旋转后形状变化导致后续 reshape 报错
np.rot90 对二维数组转 90° 后,shape[0] 和 shape[1] 互换;三维数组若指定 axes=(0, 1),仅前两维交换,通道维不变。但很多人忘记这点,在后续操作中硬写 img.reshape(h, w) 导致 ValueError: cannot reshape array。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 旋转前 shape 是
(100, 200)→ 旋转后是(200, 100) - 旋转前是
(100, 200, 3),用axes=(0, 1)→ 旋转后是(200, 100, 3) - 别手动记“宽高互换”,用
rotated.shape动态取值,比如h, w = rotated.shape[:2] - 如果后续要喂给 PyTorch 模型(要求
(C, H, W)),注意np.rot90输出仍是(H, W, C),得再用np.transpose(rotated, (2, 0, 1))
旋转本身很简单,真正卡住人的往往是——你以为它只动了像素位置,其实它悄悄改了 shape 维度顺序,而下游代码还按老 shape 在读。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










