np.rot90默认只作用于前两轴,对rgb图像需显式指定axes=(0,1);k控制旋转角度(k=1为逆时针90°),不插值、仅支持90°倍数;翻转用fliplr/flipud更安全;任意角度应交由opencv或scipy处理。

用 np.rot90 旋转图像矩阵,注意 k 和 axes 参数的实际效果
NumPy 本身不处理图像元数据(如通道顺序、像素范围),只把图像当普通三维数组(H×W×C)或二维数组(H×W)处理。np.rot90 是最轻量的旋转方式,但默认只作用于前两个轴——对 RGB 图像直接调用会出错。
常见错误现象:np.rot90(img) 对 (256, 256, 3) 数组报 ValueError: axes must be different,因为默认 axes=(0, 1),而三通道图的第 2 维(通道)被忽略,旋转后形状变成 (256, 256, 3) 看似没变,实则通道维度未参与重排,视觉上可能错乱。
- 正确做法:显式指定
axes=(0, 1)仅旋转高宽,保持通道在最后 ——np.rot90(img, k=1, axes=(0, 1)) -
k=1表示逆时针 90°,k=-1或k=3是顺时针 90°;k=2是 180° - 若图像是
C×H×W布局(如 PyTorch 默认),需改用axes=(1, 2) - 性能影响:纯内存视图操作,无拷贝,极快;但只支持 90° 倍数,不插值,不支持任意角度
用 np.fliplr 和 np.flipud 翻转时,别混淆左右/上下语义
np.fliplr 是沿 axis=1(列方向)翻转,即“镜像左右”;np.flipud 是沿 axis=0(行方向)翻转,即“镜像上下”。这两个函数对任何二维或三维数组都安全,不需要指定 axes。
使用场景:数据增强中做简单镜像增广,或预处理中统一朝向(如人脸关键点任务常水平翻转)。
- 对 RGB 图像
(H, W, 3),np.fliplr(img)直接翻转每层通道,结果正确 - 误用风险:有人以为
fliplr是“绕竖轴转”,实际它只是按列索引倒序,和坐标系无关;若图像已转置(如img.T),再用fliplr效果会反直觉 - 等价写法:
np.flip(img, axis=1)更通用,可复用于任意轴;但fliplr/flipud名称更直观,不易写错 axis 编号
需要任意角度旋转?别硬套 NumPy,该交棒给 OpenCV 或 SciPy
NumPy 没有内置双线性插值或仿射变换功能。np.rot90 只能 90° 倍数,且不重采样;强行用 scipy.ndimage.rotate 虽可行,但它底层调用的是 C 实现的插值,不属于 NumPy 生态,且默认居中旋转、填充黑边(cval=0),易踩坑。
常见错误现象:scipy.ndimage.rotate(img, 30) 对 uint8 图像输出 float64 结果,值域变成 [-100, 255],直接显示发灰或溢出;或旋转后尺寸自动扩大,导致后续 reshape 失败。
- 必须缩放并截断:
rotated = scipy.ndimage.rotate(img, 30, reshape=False, order=1, cval=0),其中order=1是双线性插值 - uint8 安全处理:
rotated = np.clip(rotated, 0, 255).astype(np.uint8) - OpenCV 更适合生产:
cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)零拷贝、原地 uint8 支持好;任意角用cv2.warpAffine+cv2.getRotationMatrix2D - 性能提示:SciPy 的
rotate在大图上比 OpenCV 慢 2–3 倍,且多一个依赖
翻转+旋转组合操作,优先用 np.transpose + 索引避免多次拷贝
比如“先水平翻转再顺时针 90°”,用 np.fliplr + np.rot90(img, k=-1) 看似自然,但触发两次内存拷贝。更高效的是合并为一次轴变换 + 索引反转。
例如:对 (H, W) 矩阵实现「水平翻转 + 顺时针 90°」等价于 img[:, ::-1].T(先列倒序,再转置);推广到 RGB:img[:, ::-1, :].transpose(1, 0, 2)。
- 优势:全程视图操作(
::-1和.transpose都不拷贝数据),内存友好 - 陷阱:
.T对三维数组等价于np.transpose(img, (2, 1, 0)),不是你想要的;务必显式写transpose(1, 0, 2)控制通道位置 - 调试技巧:用小数组(如
np.arange(12).reshape(3, 4))手动算一遍索引映射,比猜参数可靠
print(img.shape) 和 print(img.dtype),比查文档更快定位问题。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











