8

我需要可视化一个 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 图像并对其进行进一步处理。我正在使用 32 位的 python 2.7。

请帮助

谢谢


编辑 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++ 运行时库中收到运行时错误。我更好的猜测是,这是因为开放的“buffer_”。但我得到了所需的输出。


编辑2:使用关闭缓冲区

buffer_.close()

没有解决运行时错误


最后编辑解决方案

4

4 回答 4

11

除非你真的需要标记刻度等,

im._rgba_cache

让您可以直接访问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)

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

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

或者

mapped_data = my_cm(normed_data, bytes=True)

将其转换为无符号整数。

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

get_cmap文档颜色图库

编辑:在https://stackoverflow.com/a/14880947/380231指出的固定监督

于 2013-02-14T14:30:24.913 回答
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()

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

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

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

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

于 2013-02-14T08:04:57.370 回答
0

受@Thorsten Kranz启发的更新答案

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import io
plt.imshow(np.random.random((20,20)))
with io.BytesIO() as buffer:
    plt.savefig(buffer, format = "png")
    buffer.seek(0)
    image = Image.open(buffer)
    ar = np.asarray(image)
print(ar.shape)
于 2021-09-11T16:07:54.633 回答
0

在这里,我找到了更多将数组转换为 rgba 的示例,我想使用岩浆 cmap 将频谱图转换为 rgb 图像,这就是我所做的;

import matplotlib.cm as cm
sm = cm.ScalarMappable(cmap='magma')
sm.set_clim(spect.min(), spect.max())
im = sm.to_rgba(spect)

plt.imshow(im)
plt.title(im.shape)

在此处输入图像描述

于 2021-09-16T14:57:32.163 回答