ipython.display.image 是代码单元格中最快显示本地或网络图片的方式,路径需相对notebook目录,中文空格加引号;matplotlib.pyplot.imshow 适用于数组图像,注意bgr转rgb、cmap和数值范围;pil需配合display(),不可用show();%%html和markdown不支持动态逻辑。

用 IPython.display.Image 最快显示本地或网络图片
这是代码单元格里最轻量、最可靠的方式,不依赖图像解码逻辑,也不强制渲染坐标轴。只要路径对、文件可读,就能立刻出图。
常见错误现象:FileNotFoundError 或执行后空白——本质是路径没解析对,不是库的问题。
-
filename参数必须是相对于当前 notebook 文件所在目录的路径(不是 Python 工作目录) - 中文路径或空格路径要加引号,但别用 raw string(
r"中文\图.jpg"在 Windows 下可能失效) - 网络图片用
url参数,不是filename;二者不能混用 - 如果图片在子目录,写成
filename="data/imgs/photo.png",别漏掉引号
用 matplotlib.pyplot.imshow 显示数组型图像(OpenCV/PIL/NumPy 输出)
当你用 cv2.imread、PIL.Image.open 或自己生成图像数组时,必须走这条路。它本质是画图,不是“插入资源”,所以对数据格式敏感。
容易踩的坑:OpenCV 读图默认是 BGR,而 plt.imshow 按 RGB 渲染,直接显示会偏色(比如人脸发青)。
- OpenCV 图像必须先转 RGB:
plt.imshow(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)) - 灰度图加
cmap='gray',否则显示为伪彩色 - 数组值范围必须是
[0, 255](uint8)或[0, 1](float),超出会导致全黑或全白 - 记得调
plt.axis('off')关坐标轴,否则干扰视觉
用 PIL.Image + display() 处理后再显示
适合需要缩放、裁剪、格式转换等预处理的场景。PIL 不负责渲染,只做图像对象管理,最终靠 Jupyter 的 display 机制输出。
注意:img.show() 是弹系统窗口,**在 Jupyter 里完全无效**,别用。
- 正确写法是:
from IPython.display import display,然后display(img) -
img = PIL.Image.open(...)后可链式调用:img.resize((300, 200)).convert('RGB') - 如果图像模式是
'P'(索引色,如某些 PNG),需先.convert('RGBA')或'RGB'再显示,否则报错 - 不支持直接传 URL,得先用
requests.get下载再用BytesIO构造
为什么 %%html 和 Markdown 单元格不算“代码中显示”
它们确实能显示图片,但不符合“在代码单元格中执行逻辑并输出图像”的需求。前者是内联 HTML 渲染,后者根本绕过 Python 执行环境。
真正需要“代码中显示”的典型场景:批量读图、模型输出可视化、训练过程截图、图像增强效果对比——这些都要求变量参与、路径动态拼接、条件判断后才决定是否显示。
这时候硬塞进 Markdown 单元格,就失去了可编程性;用 %%html 则无法响应变量值变化,也难做异常 fallback(比如图片缺失时显示提示文字)。











