调用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
相关产品推荐
相关产品推荐

