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

调用matplotlib plt.show()后代码停滞,如何继续执行并显示图像?

解决matplotlib显示图像后代码停滞的问题

问题根源

plt.show()默认是阻塞式执行:程序会暂停在这一行,直到手动关闭弹出的图像窗口,才会继续运行后续代码。另外你最后绘制的对比子图没有调用plt.show(),即使代码执行到那里也不会显示。

解决方案1:修改plt.show()的阻塞参数

将第一个plt.show()的block参数设为False,让代码继续执行;最后绘制完所有图像后,再调用一次plt.show(block=True),让程序等待关闭所有窗口后再退出。

修改后的完整代码:

#!/usr/bin/python
import cv2
import matplotlib.pyplot as plt

image = cv2.imread("sample.jpg")

# 显示第一张图,非阻塞模式
plt.figure(figsize=[10, 10])
plt.title("Image")
plt.axis("off")
plt.imshow(image[:, :, ::-1])
plt.show(block=False)  # 关键:设置block=False

# 后续OpenCV处理代码
image_resized = cv2.resize(image, None, fx=0.5, fy=0.5)

image_cleared = cv2.medianBlur(image_resized, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)

image_cleared = cv2.edgePreservingFilter(image_cleared, sigma_s=5)

image_filtered = cv2.bilateralFilter(image_cleared, 3, 10, 5)

for i in range(2):
    image_filtered = cv2.bilateralFilter(image_filtered, 3, 20, 10)

for i in range(3):
    image_filtered = cv2.bilateralFilter(image_filtered, 5, 30, 10)

gaussian_mask = cv2.GaussianBlur(image_filtered, (7, 7), 2)
image_sharp = cv2.addWeighted(image_filtered, 1.5, gaussian_mask, -0.5, 0)
image_sharp = cv2.addWeighted(image_sharp, 1.4, gaussian_mask, -0.2, 10)

# 绘制对比子图
plt.figure(figsize=[30, 30])
plt.subplot(131)
plt.imshow(image_sharp[:, :, ::-1])
plt.title("Final Image")
plt.axis("off")
plt.subplot(132)
plt.imshow(image_cleared[:, :, ::-1])
plt.title("Clear Impurities")
plt.axis("off")
plt.subplot(133)
plt.imshow(image[:, :, ::-1])
plt.title("Original")
plt.axis("off")

# 最后调用阻塞式show,等待用户关闭窗口
plt.show(block=True)

解决方案2:合并所有绘图操作,最后只调用一次plt.show()

把所有图像的绘制代码放在一起,最后统一调用plt.show(),这样程序会一次性显示所有窗口,且不会中途停滞。

修改后的完整代码:

#!/usr/bin/python
import cv2
import matplotlib.pyplot as plt

image = cv2.imread("sample.jpg")

# 先执行所有OpenCV处理代码
image_resized = cv2.resize(image, None, fx=0.5, fy=0.5)

image_cleared = cv2.medianBlur(image_resized, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)
image_cleared = cv2.medianBlur(image_cleared, 3)

image_cleared = cv2.edgePreservingFilter(image_cleared, sigma_s=5)

image_filtered = cv2.bilateralFilter(image_cleared, 3, 10, 5)

for i in range(2):
    image_filtered = cv2.bilateralFilter(image_filtered, 3, 20, 10)

for i in range(3):
    image_filtered = cv2.bilateralFilter(image_filtered, 5, 30, 10)

gaussian_mask = cv2.GaussianBlur(image_filtered, (7, 7), 2)
image_sharp = cv2.addWeighted(image_filtered, 1.5, gaussian_mask, -0.5, 0)
image_sharp = cv2.addWeighted(image_sharp, 1.4, gaussian_mask, -0.2, 10)

# 绘制所有图像
plt.figure(figsize=[10, 10])
plt.title("Image")
plt.axis("off")
plt.imshow(image[:, :, ::-1])

plt.figure(figsize=[30, 30])
plt.subplot(131)
plt.imshow(image_sharp[:, :, ::-1])
plt.title("Final Image")
plt.axis("off")
plt.subplot(132)
plt.imshow(image_cleared[:, :, ::-1])
plt.title("Clear Impurities")
plt.axis("off")
plt.subplot(133)
plt.imshow(image[:, :, ::-1])
plt.title("Original")
plt.axis("off")

# 一次性显示所有窗口,阻塞直到关闭
plt.show()

注意事项

  • 如果使用方案1,block=False的窗口可能会在程序结束时自动关闭,所以最后必须加plt.show(block=True)来保持窗口打开。
  • 两种方案都能解决代码停滞问题,选择哪种取决于你是否需要先看到第一张图再执行后续处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 17:43:14