2014-07-14 10 views
13

Ho riscontrato il seguente problema: Sto salvando le immagini Tiff a 16 bit con un microscopio e ho bisogno di analizzarle. Voglio farlo con numpy e matplotlib, ma quando voglio fare qualcosa di semplice come tracciare l'immagine in verde (avrò più tardi bisogno di sovrapporre altre immagini), fallisce.I grafici di matplotlib sono diversi se si utilizza la matrice di colori o l'array RGB

Ecco un esempio quando provo a tracciare l'immagine come una matrice RGB o con la mappa di colori jet predefinita.

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 

imageName = 'image.tif' 

# image as luminance 
img1 = cv2.imread(imageName,-1) 

# image as RGB array 
shape = (img1.shape[0], img1.shape[1], 3) 
img2 = np.zeros(shape,dtype='uint16') 
img2[...,1] += img1 

fig = plt.figure(figsize=(20,8)) 
ax1 = fig.add_subplot(1,2,1) 
ax2 = fig.add_subplot(1,2,2) 

im1 = ax1.imshow(img1,interpolation='none') 
im2 = ax2.imshow(img2,interpolation='none') 
fig.show() 

Che per me si ottiene la seguente figura: enter image description here

Mi dispiace se la domanda è troppo semplice, ma non ho idea del perché la trama destra sta mostrando questo artefatti. Mi piacerebbe ottenere con la scala verde, qualcosa di simile a come appare la figura (anche imageJ offre qualcosa di simile alla trama di sinistra).

Grazie mille per la collaborazione.

+0

Quello che stai vedendo è probabilmente il risultato dell'overflow dei valori di 'uint16' in' img2'. Cosa produce 'print img1.dtype'? Che dire di 'print img1.min(), img1.max()'? –

+0

Sono solo io o le due immagini sono strutturalmente uguali ma sembra che abbiano solo una diversa mappa colori? È questo il problema? –

risposta

34

trovo la trama giusta molto più artistica ...

matplotlib è piuttosto complicato quando si tratta di immagini che interpretano. Va approssimativamente come segue:

  • se l'immagine è una matrice NxM di qualsiasi tipo, viene interpretato attraverso la mappa colori (autoscale, se non indicato diversamente). (In linea di principio, se l'array è un array float scalato a 0..1, dovrebbe essere interpretato come un'immagine in scala di grigi. Questo è ciò che dice la documentazione, ma in pratica ciò non accade.)

  • l'immagine è una matrice NxMx3 float, i componenti RGB sono interpretati come componenti RGB tra 0..1. Se i valori non rientrano in questo intervallo, vengono presi con modulo positivo 1, ovvero 1,2 -> 0,2, -1,7 -> 0,3, ecc.

  • se l'immagine è un array NxMx3 uint8, viene interpretata come immagine standard (0..255 componenti)

  • se l'immagine è NxMx4, l'interpretazione è come sopra, ma il quarto componente è l'opacità (alfa)

Quindi, se si dà un matplotlib NxMx3 array di numeri interi diversi da uint8 o float, i risultati non sono definiti. Tuttavia, guardando il codice sorgente, il behavour dispari può essere compreso:

if A.dtype != np.uint8: 
    A = (255*A).astype(np.uint8) 

dove A è la matrice dell'immagine. Quindi, se gli dai i valori uint16 0, 1, 2, 3, 4 ..., ottieni 0, 255, 254, 253, ... Sì, sembrerà molto strano. (IMHO, l'interpretazione potrebbe essere un po 'più intuitivo, ma questo è come è fatto.)


In questo caso la soluzione più semplice è quella di dividere la matrice da 65535, e quindi l'immagine deve essere il più previsto. Inoltre, se l'immagine originale è veramente lineare, allora avrete bisogno di fare la correzione gamma inversa:

img1_corr = (img1/65535.)**(1/2.2) 

caso contrario, i toni medi sarà troppo scura.

+0

Ottima risposta. Trovo sempre che questi tipi di interi (uint8, byte, ecc.) Sono molto limitanti per qualsiasi tipo di elaborazione delle immagini, sebbene abbiano senso quando è necessario salvare il file. Con matplotlib, l'approccio più accurato IMO è quello di normalizzare ogni immagine con un numero intero nell'intervallo 0-1 non appena si ottiene, e solo allora eseguire operazioni matematiche (ad esempio, correggere la gamma in questo modo: 'im ** = gamma' [puoi credere che funzioni ?!]). Quindi traccia la mappa dei colori desiderata e decodifica al momento del salvataggio. – heltonbiker

Problemi correlati