这个问题是tcaswell (answer #2) 为我的问题提供的解决方案的延续:Is there a way to convert pyplot.imshow() object to numpy array?
考虑以下python代码:
import pylab
import numpy as np
a = np.array( ( 30, 129 ) , dtype = np.float32 )
b = np.array( ( 30, 129 ) , dtype = np.int32 )
my_cm = pylab.cm.get_cmap('jet')
a_mapped_data = my_cm( a )
b_mapped_data = my_cm( b )
我正在使用一个小数组来节省空间,但即使使用大数组也是如此。
结果:
>>> a
array([ 30., 129.], dtype=float32)
>>> b
array([ 30, 129])
>>> a_mapped_data
array([[ 0.5, 0. , 0. , 1. ],
[ 0.5, 0. , 0. , 1. ]])
>>> b_mapped_data
array([[ 0. , 0. , 1. , 1. ],
[ 0.5028463 , 1. , 0.46489564, 1. ]])
我似乎不明白这里的行为。即使值相同,实例cm.get_map()
也会为数据类型产生不同的结果。上面的代码有问题吗?请帮忙解决这个问题。我需要绘制 numpy.float 类型的二维数组。numpy.int32
numpy.float32
谢谢
我在 Windows7 x64 Home Basic 上使用 python 2.7.3 32bit
编辑: 为那些与我面临同样问题的人提供解决方案
下面的脚本对输入数据执行颜色映射,并将映射按原样转换为图像,不使用pylab.imshow
或不使用pylab.pcolor
任何比例或边框。我感谢每个做出贡献并帮助我了解如何完成的人。
import pylab
import numpy as np
a = np.random.random( (512, 512) )*100
# a is a 2D array of random data not in the range of 0.0 to 1.0
# normalize the data
normed_a = ( a - a.min() )/( a.max() - a.min() )
# now create an instance of pylab.cm.get_cmap()
my_cm = pylab.cm.get_cmap('jet_r')
# create the map
mapped_a = my_cm( normed_a )
# to display the map, opencv is being used
# import opencv
import cv2 as cv
# convert mapped data to 8 bit unsigned int
mapped_au8 = (255 * mapped_a).astype('uint8')
# show the image
cv.imshow( 'a', mapped_au8 )
cv.waitKey( 0 )
cv.destroyAllWindows()
编辑:返回类型cm.get_cmap
实例为 RGBA 格式,但 OpenCV 默认以 BGR 格式运行。因此,在显示通过转换cm.get_cmap()
上面代码中实例的返回值获得的任何图像之前,将其转换为 BGR 格式(在显示图像之前,默认情况下,在 opencv 中,ALPHA 通道无论如何都会被剥离,因此除非必要,否则不要费心将其转换为 BGRA) . 下面的代码给出了更好的解释:
mapped_au8 = (255 * mapped_a).astype('uint8')
#convert mapped_au8 into BGR fromat before display
mapped_u8 = cv.cvtColor( mapped_au8, cv.COLOR_RGBA2BGR )
# show the image
cv.imshow( 'a', mapped_au8 )
cv.waitKey( 0 )
cv.destroyAllWindows()