2013-03-14 14 views
5

Jak przekonwertować obraz w skali szarości M x N, lub innymi słowy macierz lub tablicę 2-D, na mapę termowizyjną RGB lub innymi słowy M x N tablica x 3?Konwersja obrazu w skali szarości na obraz termowizyjny RGB z matplotlib

przykład:

[[0.9, 0.3], [0.2, 0.1]] 

powinno się

[[red, green-blue], [green-blue, blue]] 

gdzie jest [1, 0, 0] czerwony, niebieski jest [0, 0, 1] itp.

+0

Zobacz również: http://stackoverflow.com/questions/14869321/is-there-a-way-to-convert-pyplot-imshow-object-to-numpy-array/14877059#14877059. Pamiętaj, aby zaakceptować własną odpowiedź, kiedy ci to pozwoli. – tacaswell

+0

Zgadzam się, to jest podobne do tego pytania, chociaż jest to sformułowane bardziej precyzyjnie. (Szukałem przez chwilę i nie mogłem znaleźć tego pytania.) Jestem całkiem nowy w stackoverflow; czy się łączymy czy coś? – rd11

+0

Nie martw się, nie podejmuj żadnych działań. Oznaczyłem to jako możliwy duplikat, jeśli 4 inne osoby z 3k + przedstawicielem zgodzą się, że to zostanie zamknięte jako duplikat (co oznacza po prostu brak nowych odpowiedzi i stały link do drugiego pytania). Jeśli inne osoby nie wyrażą na to zgody, komentarz pozostanie, ale moje głosowanie bliskie zniknie. Zgadzam się, że udało Ci się lepiej zidentyfikować prawdziwy problem (na podstawie komentarza w Twojej odpowiedzi na temat używania 'imshow'). – tacaswell

Odpowiedz

13
import matplotlib.pyplot as plt 

img = [[0.9, 0.3], [0.2, 0.1]] 

cmap = plt.get_cmap('jet') 

rgba_img = cmap(img) 
rgb_img = np.delete(rgba_img, 3, 2) 

cmap jest wystąpienie matplotlib w LinearSegmentedColormap klasy, który wywodzi się z grupy Colormap. Działa z powodu funkcji __call__ zdefiniowanej w Colormap. Tutaj jest docstring z repozytorium git repo matplotlib, ponieważ nie jest to opisane w API.

def __call__(self, X, alpha=None, bytes=False): 
    """ 
    *X* is either a scalar or an array (of any dimension). 
    If scalar, a tuple of rgba values is returned, otherwise 
    an array with the new shape = oldshape+(4,). If the X-values 
    are integers, then they are used as indices into the array. 
    If they are floating point, then they must be in the 
    interval (0.0, 1.0). 
    Alpha must be a scalar between 0 and 1, or None. 
    If bytes is False, the rgba values will be floats on a 
    0-1 scale; if True, they will be uint8, 0-255. 
    """ 

Prostszym rozwiązaniem jest wyświetlanie img korzystając plt.imshow lub plt.matshow, a następnie skopiować lub zapisać wynik jako RGB lub RGBA obrazu. To było zbyt wolne dla mojej aplikacji (~ 30 razy wolniej na mojej maszynie).

+0

+1. Dzięki opisanej metodzie (zamiast imshow) masz gwarancję odzyskania obrazu o tych samych wymiarach. Jeśli chcesz mieć obraz o różnej wielkości, możesz go pobrać z programu imshow (z koniecznym dostrojeniem), ponieważ już on interpoluje obraz. – heltonbiker

Powiązane problemy