我正在使用matplotlib.pyplot和numpy后端在Python中编写一个图像处理模块。 图像将主要采用tiff格式,因此下面的代码使用tifffile将3D图像文件转换为numpy中的4D数组。下面的代码旨在使用z和x作为热键,一次移动3D图像的z平面,一次一个图像。我的问题非常有趣,我无法弄明白:事件和动作之间的时间(按x并显示z + 1图像)每次事件的时间都是两倍。 我计时了,结果如下: 第一次按压:0.124秒 第二个z-prss:0.250秒 第三次z-press:0.4875 s
这是一个真正的线性增长,但我无法找到我的代码中的错误。
import matplotlib.pyplot as plt
import numpy as np
import tifffile as tiff
class Image:
def __init__ (self, fname):
self.fname = fname
self.fig = plt.figure()
self.z = 0
self.ax = self.fig.add_subplot(111)
self.npimg = tiff.imread(self.fname)
self.plotimg()
self.connect()
def plotimg(self):
plt.imshow(self.npimg[self.z][0])
plt.show()
def connect(self):
self.cidkeypress = self.fig.canvas.mpl_connect('key_press_event',self.keypress)
def disconnect(self):
self.fig.canvas.mpl_disconnect(self.cidkeypress)
def keypress(self, event):
if event.key == 'x':
self.z += 1
self.plotimg()
elif event.key == 'z':
self.z -= 1
self.plotimg()
答案 0 :(得分:0)
由于您没有提供示例文件,因此我无法测试您的代码。但我认为问题是,你反复打电话给plt.imshow()
。每次将新的AxesImage
对象添加到图中。这就是时间线性增加的原因。
所以解决方案是只有一个AxesImage
对象并且只更新数据。如下调整__init__
和plotimg
:
def __init__ (self, fname):
self.fname = fname
self.fig = plt.figure()
self.z = 0
self.ax = self.fig.add_subplot(111)
self.npimg = tiff.imread(self.fname)
self.pltim = plt.imshow(self.npimg[self.z][0])
self.connect()
plt.show()
def plotimg(self):
self.pltim.set_data(self.npimg[self.z][0])
plt.draw()
注意:未经测试的代码!
plt.imshow
和plt.show
之间的差异:尽管它们名称相似,但它们做的事情却截然不同:plt.imshow
是一个绘图功能,它将图像绘制到当前轴(类似于plt.plot
,plt.scatter
等) plt.show
然而,在屏幕上显示图形并进入后端主循环(即阻止您的代码)。 This answer更详细地解释了