在pdb模式下输入imshow(img)时matplotlib图形不显示

5 投票
1 回答
7419 浏览
提问于 2025-04-18 07:55

有没有人遇到过在调试模式(PDB)下使用spyder时出现这个问题?在交互模式下运行得很好。

有人建议的一个解决办法是,在imshow(img)之后使用pause(1),而不是show()

有没有更好的方法可以在调试模式下查看我的图形?如果有的话,那真是对Matlab的一个重大打击!

1 个回答

11

为了回答我自己的问题。显然这是一个bug,而且在PDB模式下,pause(1)是唯一能让你看到绘图的办法。

另一种方法是把整个程序作为脚本运行,可以把代码剪切并粘贴到命令行里。这样就可以用show()代替pause(1)。这样做的好处是,你可以在图上放大查看。而使用pause(1)时,只能在暂停期间进行放大。

举个例子:

import numpy as np
from matplotlib import pyplot as plt
import cv2

file_name = 'myimage.jpg'
img = cv2.imread(file_name)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,150,100,apertureSize = 3)

#display image
plt.figure(1)
plt.imshow(edges)
plt.title('edges of image')
plt.show()

补充:

我刚发现一个不错的Python绘图工具,叫guiqwt

它在pdb中可以使用,不像matplotlib那样。

import numpy as np
from guiqwt.pyplot import *
figure("simple plot")
subplot(1, 2, 1)
plot(x, np.tanh(x+np.sin(12*x)), "g-", label="Tanh")
legend()
subplot(1, 2, 2)
plot(x, np.sinh(x), "r:", label="SinH")
show()

你可以在python(x,y)的附带包中找到它,或者你也可以从这里下载。

补充2:

我刚发现最新发布的IDE,Pycharm对matplotlib的支持更好。你可以使用plt.imshow(img),甚至不需要使用plt.show()就能在调试模式下显示图像。

撰写回答