Экземпляр pyplot.cm выдает разные результаты для тех же значений, но с разным типом данных

Этот вопрос является продолжением решения, предоставленногоtcaswell (ответ № 2) на мой вопрос:Есть ли способ преобразовать объект pyplot.imshow () в массив numpy?

Рассмотрим следующий код 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.int32 а такжеnumpy.float32 типы данных. Что-то не так с кодом выше? Пожалуйста, помогите с этим. Мне нужно построить 2D-массивы типа numpy.float.

Спасибо

Я использую Python 2.7.3 32bit на Windows7 x64 Home Basic

РЕДАКТИРОВАТЬ : Решение для тех, кто сталкивается с той же проблемой, что и я

Приведенный ниже скрипт выполняет цветовую карту для входных данных, и карта преобразуется в изображение как есть, без использования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 (Канал ALPHA в любом случае удаляется по умолчанию в opencv перед отображением изображения, так что не беспокойтесь о преобразовании его в 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()

Ответы на вопрос(1)

Ваш ответ на вопрос