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

Yas*_*ash 5 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()
Run Code Online (Sandbox Code Playgroud)

我按预期获得输出.

现在我的问题是,有没有办法将上面的代码中的"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()
Run Code Online (Sandbox Code Playgroud)

在程序终止后,我从MS VC++运行时库中收到运行时错误.我更好的猜测是因为打开"buffer_".但我得到了所需的输出.


编辑2:使用关闭缓冲区

buffer_.close()
Run Code Online (Sandbox Code Playgroud)

没有解决运行时错误


最终编辑:解决方案

tac*_*ell 10

除非你真的需要标记滴答等,

im._rgba_cache
Run Code Online (Sandbox Code Playgroud)

使您可以直接访问numpy作为颜色映射数据的MxNx4 阵列.

如果您只想要颜色映射数据,您可以通过imshow完全直接对自己的数据进行颜色映射(请参阅选择颜色映射的指南)

my_cm = maplotlib.cm.get_cmap('Reds')
normed_data = (data - np.min(data)) / (np.max(data) - np.min(data))
mapped_data = my_cm(normed_data)
Run Code Online (Sandbox Code Playgroud)

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

mapped_datau8 = (255 * my_cm(normed_data)).astype('uint8')
Run Code Online (Sandbox Code Playgroud)

要么

mapped_data = my_cm(normed_data, bytes=True)
Run Code Online (Sandbox Code Playgroud)

将它转换为无符号整数.

matplotlib包括一系列规范化代码,请参见此处.

get_cmapdoccolormap库

编辑:固定监督指出/sf/answers/1041666321/

  • 尝试使用 `im._rgba_cache` 直接访问 numpy 数组会抛出 `AttributeError: 'AxesImage' object has no attribute '_rgba_cache'`。我们第一个片段中的“im”是什么? (2认同)

Tho*_*anz 5

您确定要转换方法的返回值或整个图吗?

对于后者,您应该尝试:

  • 使用以下命令将绘图保存到 StringIO 缓冲区图像 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()
Run Code Online (Sandbox Code Playgroud)

查看savefig-*args以及**kwargs更多选项,例如 dpi、背景颜色、透明度、填充等。

如果你只是想要彩色编码的图像,没有轴、标签等,我仍然会这样做,只需使用

plt.subplots_adjust(0,0,1,1)
Run Code Online (Sandbox Code Playgroud)

将轴延伸到整个图形。照顾好aspect你的情节,否则 mpl 可能会再次缩小你的轴。