You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中如何保留平移缩放且仅显示当前图像轮廓?

问题描述

原代码如下:

plt.get_current_fig_manager().full_screen_toggle()

for img in imgs:
  plt.clf()
  plt.imshow(img, origin='upper', interpolation='None', aspect='equal', cmap='gray')
  plt.gca().contour(img, np.arange(0, 255, 8), colors='r')
  
  while not plt.waitforbuttonpress():
    pass

这段代码遍历imgs列表显示连续图像,每张图像都会叠加自身轮廓,但存在矛盾:

  • 用plt.clf()清除画布,切换图像时会丢失之前的平移、缩放状态
  • 删掉plt.clf(),平移缩放状态能保留,但所有历史图像的轮廓会叠加显示,没法只留当前图像的轮廓
解决方案

核心就是别每次清除重绘,而是复用已有的绘图对象,只更新数据:

import matplotlib.pyplot as plt
import numpy as np

plt.get_current_fig_manager().full_screen_toggle()

# 先初始化第一个图像和轮廓,固定用同一个坐标轴
fig, ax = plt.subplots()
im = ax.imshow(imgs[0], origin='upper', interpolation='None', aspect='equal', cmap='gray')
contour = ax.contour(imgs[0], np.arange(0, 255, 8), colors='r')

plt.show(block=False)  # 非阻塞显示,让后续代码能执行

# 从第二个图像开始遍历更新
for img in imgs[1:]:
    # 直接更新图像数据,不重建图像对象
    im.set_data(img)
    
    # 移除旧轮廓,再画新的
    for coll in contour.collections:
        coll.remove()
    contour = ax.contour(img, np.arange(0, 255, 8), colors='r')
    
    # 刷新画布显示更新内容
    fig.canvas.draw_idle()
    
    # 等待按键切换图像
    while not plt.waitforbuttonpress():
        pass

关键说明

  • 复用同一个ax坐标轴对象,平移缩放的状态会一直保留
  • im.set_data(img)只更新图像像素数据,不会重置轴的状态
  • 每次切换图像时,先删掉之前的轮廓集合,再重新绘制当前图像的轮廓,避免叠加
  • fig.canvas.draw_idle()确保画布及时刷新显示最新内容

内容的提问来源于stack exchange,提问作者Paul Jurczak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:47:32