Python 有没有办法将pyplot.imshow()对象转换为numpy数组?

Python 有没有办法将pyplot.imshow()对象转换为numpy数组?,python,opencv,numpy,matplotlib,Python,Opencv,Numpy,Matplotlib,我需要可视化一个2D numpy数组。我正在使用pyplot进行此操作。 代码如下: import cv2 as cv import numpy as np from matplotlib import pyplot img = pyplot.imshow( radiance_val ) #radiance_val is a 2D numpy array of size = ( 512, 512 ) #filled with np.float32 values pyplot.show()

我需要可视化一个2D numpy数组。我正在使用pyplot进行此操作。 代码如下:

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

img = pyplot.imshow( radiance_val )
#radiance_val is a 2D numpy array of size = ( 512, 512 ) 
#filled with np.float32 values

pyplot.show()
我得到了预期的输出

现在我的问题是,有没有办法将上面代码中的“img”从pyplot类型转换为numpy类型。我需要这个,以便我可以加载作为opencv图像的可视化,并对其执行进一步的处理。我正在使用python 2.7,32位

好心帮忙

多谢各位


编辑1:在Thorsten Kranz的解决方案之后

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import PIL
from cStringIO import StringIO

frame1 = plt.gca()
frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)
plt.imshow(np.random.random((10,10)))

buffer_ = StringIO()
plt.savefig( buffer_, format = "png", bbox_inches = 'tight', pad_inches = 0 )
buffer_.seek(0)

image = PIL.Image.open( buffer_ )

ar = np.asarray(image)
cv.imshow( 'a', ar )
cv.waitKey(0)
cv.destroyAllWindows()
在这里,在程序终止后,我从MS VC++运行库中得到一个运行时错误。我更好的猜测是,这是因为开放的“缓冲区”。但我得到了所需的输出


编辑2:使用关闭缓冲区

buffer_.close()
没有解决运行时错误



最终编辑

是否确实要转换方法或整个绘图的返回值

对于后者,您应该尝试:

  • 使用
    savefig
  • 使用PIL或opencv从此缓冲区加载图像
  • 将其转换为numpy数组
见下面的示例:

import numpy as np
import matplotlib.pyplot as plt
import PIL
from cStringIO import StringIO

plt.imshow(np.random.random((20,20)))
buffer_ = StringIO()
plt.savefig(buffer_, format = "png")
buffer_.seek(0)
image = PIL.Image.open(buffer_)
ar = np.asarray(image)
buffer_.close()
查看
savefig
-
*args
**kwargs
了解更多选项,例如dpi、背景色、透明度、填充等

如果您希望得到彩色编码的图像,没有轴、标签等,我仍然会这样做,只需使用

plt.subplots_adjust(0,0,1,1)

在整个图形上延伸轴。注意绘图的
方面,否则mpl可能会再次收缩轴。

除非您确实需要标记记号等

im._rgba_cache
允许您直接访问作为颜色映射数据的MxNx4
numpy
阵列

如果您只需要颜色映射数据,您可以通过
imshow
完全直接地对自己的数据进行颜色映射(有关选择颜色映射的信息,请参阅)

这将返回一个映射在
0
1
之间的MxNx4数组

mapped_datau8 = (255 * my_cm(normed_data)).astype('uint8')

将其转换为无符号整数

matplotlib
包括一系列规范化代码


编辑:修正了在

Awesome上指出的疏忽,这对我很有效。非常感谢你。我很想知道你的解决方案提供了什么。不过我有个问题。我将脚本放入一个文件并执行它。程序终止后,我从Microsoft VC++运行时库中得到一个运行时错误(该应用程序要求运行时以一种不寻常的方式终止它)。我已经编辑了我的帖子以包含代码。你能告诉我怎么改正吗。我更好的猜测是开放的“缓冲区”。但是没有关闭PIL中打开的文件的选项。buffer是StringIO对象,与PIL无关。您可以通过调用
buffer.close()
释放所有已使用的资源。虽然我不确定这是否能解决你的问题。不过,在我们继续搜索之前,请尝试一下这个方法。我包含了缓冲区\.close(),但没有效果。我仍然得到一个运行时错误,和前面提到的一样,在我之前的评论中。请在我的帖子中找到完整的代码。我已根据您的解决方案对其进行了编辑。您可以尝试将cStringIO import StringIO的
替换为StringIO import StringIO的
。这可能会稍微慢一点(此处不相关),但会减少对已编译C代码的依赖性。如果不使用matplotlib,只将
np.random.random((20,20))
放入
cv.imshow
,是否也会发生这种情况?也许设置另一个mpl后端会有所帮助,例如,
import matplotlib;matplotlib.use(“Agg”)
在脚本的开头。我添加了Thorsten Kranz提到的buffer.close(),但出现了运行时错误。哇,您的解决方案保留了原始图像尺寸,这是我的下一个问题。非常感谢你。我也没有得到任何运行时错误。顺便说一下,它的
my\u cm=matplotlib.cm.get\u cmap('jet')
。在
'my\u cm=matplotlib.cm.get\u cmap('jet')
中传递
'jet'
有什么特殊目的吗?我这样问是因为我得到的是相同的输出,但没有通过。如果你想使用不同的颜色映射ex,
get\u cmap('jet\u r')
你可以直呼其名。得到同样的结果是,如果不传递参数,它将返回默认值(除非已更改,否则它是
'jet'
)。尝试使用
im直接访问numpy数组。\u rgba_cache
抛出
AttributeError:'AxesImage'对象没有属性'\u rgba_cache'
。在我们的第一个片段中,
im
是什么?正如@FaCoffee所提到的,
im.\u rgba\u cache
在答案的第一行中是什么?
mapped_datau8 = (255 * my_cm(normed_data)).astype('uint8')
mapped_data = my_cm(normed_data, bytes=True)