我需要可视化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 ++运行时库中收到运行时错误。我更好的猜测是因为打开“buffer_”。但我得到了所需的输出。
编辑2:使用
关闭缓冲区buffer_.close()
没有解决运行时错误
最终修改: SOLUTION
答案 0 :(得分:9)
除非你真的需要标记滴答等,否则
im._rgba_cache
允许您直接访问作为颜色映射数据的MxNx4 numpy
数组。
如果您只想要颜色映射数据,可以完全通过imshow
并直接对自己的数据进行颜色映射(请参阅guide选择颜色图)
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)
将返回在0
和1
之间映射的MxNx4数组,
mapped_datau8 = (255 * my_cm(normed_data)).astype('uint8')
或
mapped_data = my_cm(normed_data, bytes=True)
会将其转换为无符号整数。
matplotlib
包含一系列规范化代码see here。
答案 1 :(得分:4)
你确定要转换方法或整个图的返回值吗?
对于后者,你应该尝试:
savefig
见下面的示例:
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可能会再缩小你的轴。