Il problema
C'è un one-to-one mapping dai colori indicizzati nel parula
colormap a triplette RGB. Tuttavia, non esiste una mappatura one-to-one per invertire questo processo per convertire un colore indicizzato parula
in RGB (in effetti ci sono un numero infinito di modi per farlo). Pertanto, non esiste una corrispondenza uno-a-uno o bijection tra i due spazi. La trama seguente, che mostra i valori R, G e B per ciascun indice parula
, rende questo più chiaro.
Questo è il caso per colori più indicizzati. Qualsiasi soluzione a questo problema sarà non unica.
un built-in Solution
io dopo aver giocato in giro con questo un po ', mi sono reso conto che c'è già una funzione built-in che può essere sufficiente: rgb2ind
, che converte i dati di immagine RGB in indicizzati dati di immagine. Questa funzione utilizza dither
(che a sua volta chiama la funzione mex ditherc
) per eseguire la trasformazione inversa della mappa di colori.
Ecco una dimostrazione che utilizza la compressione JPEG per aggiungere rumore e distorcere i colori nei dati parula
indice originale:
img0 = peaks(32); % Generate sample data
img0 = img0-min(img0(:));
img0 = floor(255*img0./max(img0(:))); % Convert to 0-255
fname = [tempname '.jpg']; % Save file in temp directory
map = parula(256); % Parula colormap
imwrite(img0,map,fname,'Quality',50); % Write data to compressed JPEG
img1 = imread(fname); % Read RGB JPEG file data
img2 = rgb2ind(img1,map,'nodither'); % Convert RGB data to parula colormap
figure;
image(img0); % Original indexed data
colormap(map);
axis image;
figure;
image(img1); % RGB JPEG file data
axis image;
figure;
image(img2); % rgb2ind indexed image data
colormap(map);
axis image;
Questo dovrebbe produrre immagini simili ai primi tre di seguito.
Soluzione alternativa: differenza cromatica
Un altro modo per eseguire questa operazione è confrontando la differenza tra i colori dell'immagine RGB con i valori RGB che corrispondono a ciascun indice colormap . Il modo standard per farlo è calculating ΔE nello spazio colore CIE L*a*b*. Ho implementato una forma di questo in una funzione generale denominata rgb2map
che può essere downloaded from my GitHub. Questo codice si basa su makecform
e applycform
in Image Processing Toolbox per convertire da RGB allo spazio colore CIE L * a * b * del 1976.
Il codice seguente produrrà un'immagine come quella qui sopra a destra:
img3 = rgb2map(img1,map);
figure;
image(img3); % rgb2map indexed image data
colormap(map);
axis image;
Per ogni pixel RGB un'immagine in ingresso in, rgb2map
calcola la differenza di colore fra essa e ogni tripletta RGB nella mappa colori ingresso utilizzando lo standard CIE 1976. La funzione min
viene utilizzata per trovare l'indice del minimo Δ E (se esiste più di un valore minimo, viene restituito l'indice del primo). Mezzi più sofisticati possono essere usati per selezionare il colore "migliore" nel caso di più Δ E minimo, ma saranno più costosi.
Conclusioni
Come esempio finale, ho usato an image of the namesake Parula bird di confrontare i due metodi nella figura seguente. I due risultati sono abbastanza diversi per questa immagine. Se modifichi manualmente rgb2map
per utilizzare lo standard di differenza di colore più complesso CIE 1994, otterrai un altro rendering. Tuttavia, per le immagini che corrispondono più strettamente alla colormap originale parula
(come sopra) entrambe dovrebbero restituire risultati più simili. È importante sottolineare che i vantaggi di rgb2ind
derivano dal chiamare le funzioni mex e sono quasi 100 volte più veloci di rgb2map
nonostante diverse ottimizzazioni nel mio codice (se si utilizza lo standard CIE 1994, è circa 700 volte più veloce).
Infine, coloro che vogliono saperne di più su mappe di colori in Matlab, dovrebbe leggere questo four-part MathWorks blog post da Steve Eddins sul nuovo parula
mappa di colori.
Aggiornamento 6-20-2015:rgb2map
codice sopra descritto aggiornato per utilizzare diverse trasformazioni dello spazio colore, che migliora la sua velocità di quasi un fattore due.
Non è completamente chiaro per me: vuoi recuperare la matrice che è stata utilizzata per creare la prima immagine (con 'imshow' e la colormap parula)? – Ratbert
Sì. Voglio recuperare i dati che sono stati utilizzati per creare la prima immagine Parula.Voglio essere in grado di creare la prima immagine leggendo il file di nuovo in Matlab e quindi tracciarlo di nuovo. –
OK. Se non sai quale sia stata l'impostazione di 'caxis '(_i.e._intervallo del colormap) c'è un'indeterminazione. Ad esempio, il blu potrebbe essere qualsiasi valore in base a questa impostazione ... Una soluzione ti darebbe una matrice compresa tra 0 e 1, ad esempio, che potrebbe non essere l'intervallo di dati iniziale. – Ratbert