La instancia de pyplot.cm produce resultados diferentes para los mismos valores pero tipos de datos diferentes

Esta pregunta es una continuación de la solución proporcionada portcaswell (respuesta # 2) para mi pregunta:¿Hay alguna manera de convertir el objeto pyplot.imshow () en una matriz numpy?

Considere el siguiente código de 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 )

Estoy usando una matriz pequeña para ahorrar espacio, pero esto es lo que se ve incluso cuando se usan matrices grandes.

Los resultados:

>>> 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.        ]])

Parece que no entiendo el comportamiento aquí. Aunque los valores son los mismos,cm.get_map() instancia está produciendo diferentes resultados paranumpy.int32 ynumpy.float32 tipos de datos. ¿Hay algo mal con el código de arriba? Por favor ayuda con esto. Necesito trazar arrays 2D de tipo numpy.float.

Gracias

Estoy usando python 2.7.3 de 32 bits en Windows 7 x64 Home Basic

EDITAR: Solución para quienes se enfrentan al mismo problema que yo.

La siguiente secuencia de comandos realiza un mapa de color en los datos de entrada y el mapa se convierte en imagen tal como está, sin usarpylab.imshow opylab.pcolor y sin escalas ni bordes. Agradezco a todos los que contribuyeron y me ayudaron a comprender cómo se puede hacer.

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()

EDITAR: Tipo de retornocm.get_cmap la instancia es de formato RGBA pero OpenCV opera de forma predeterminada en formato BGR. Por lo tanto, antes de mostrar cualquier imagen obtenida mediante la conversión de valores de retorno decm.get_cmap() instancia como en el código anterior, conviértalo a formato BGR (De todos modos, el canal ALFA se elimina de forma predeterminada en modo abierto antes de que se muestre la imagen, así que no se moleste en convertirlo en BGRA a menos que sea necesario ). El siguiente código da una mejor explicación:

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()

Respuestas a la pregunta(1)

Su respuesta a la pregunta