Python实现图片转numpy数组翻转后还原 现有代码优化问询
优化实现方案
原有代码问题梳理
- 缺少依赖导入:使用了
Image类但没有导入from PIL import Image,运行会直接报错 - 数组维度错误:手动循环把二维/三维的图像像素压成了一维列表,转成数组后翻转也只是一维顺序反转,完全丢失了图像的宽高结构,根本无法还原为正常图片
- 方法调用错误:PIL的
Image.show()方法不接收数组参数,传入反转后的数组不会生效
最优实现代码
无需手动循环读取像素,直接借助numpy和PIL的内置方法就能完成全部需求,代码简洁且执行效率更高:
import numpy as np from PIL import Image import requests from io import BytesIO import matplotlib.pyplot as plt # 读取网络图片 response = requests.get('https://www.boredpanda.com/blog/wp-content/uploads/2014/08/cat-looking-at-you-black-and-white-photography-1.jpg') im = Image.open(BytesIO(response.content)) # 直接转换为numpy数组,自动保留原始维度(高度x宽度x通道数) img_arr = np.array(im) # 图像翻转,可根据需求选择翻转方式 reversed_arr = img_arr[::-1, :, :] # 上下翻转(沿水平轴翻转) # reversed_arr = img_arr[:, ::-1, :] # 左右翻转(沿垂直轴翻转) # 单通道灰度图可简化维度,比如上下翻转写为 reversed_arr = img_arr[::-1, :] # 方案1:转回PIL图片后显示 reversed_im = Image.fromarray(reversed_arr) reversed_im.show() # 方案2:用matplotlib直接显示数组 # plt.imshow(reversed_arr) # plt.axis('off') # 隐藏坐标轴 # plt.show()
实现优势
- 省去冗余的手动循环逻辑,numpy内置操作底层为C实现,处理大尺寸图片时效率比Python循环高数十倍
- 完整保留图像的维度结构,翻转操作精准对应图像的空间变换,不会出现维度错乱问题
- 兼容性强,支持灰度图、RGB图、RGBA图等所有常见图片格式,不需要根据图片类型修改代码
内容的提问来源于stack exchange,提问作者ObviouslyImMe
相关产品推荐
相关产品推荐

