Immagine multipla da raster a RGB

Ho un set di dati immagine che è un dataset multibanda di formato arff. Sembra questo:

8.3000000e+001 9.3000000e+001 9.6000000e+001 7.5000000e+001 1.0000000e+000 8.3000000e+001 9.3000000e+001 9.6000000e+001 7.5000000e+001 1.0000000e+000 8.3000000e+001 9.3000000e+001 9.6000000e+001 7.5000000e+001 1.0000000e+000 8.3000000e+001 9.3000000e+001 9.6000000e+001 7.5000000e+001 1.0000000e+000 7.4000000e+001 8.4000000e+001 8.6000000e+001 7.1000000e+001 1.0000000e+000 7.4000000e+001 8.4000000e+001 8.6000000e+001 7.1000000e+001 1.0000000e+000 7.4000000e+001 8.4000000e+001 8.6000000e+001 7.1000000e+001 1.0000000e+000 7.4000000e+001 8.4000000e+001 8.6000000e+001 7.1000000e+001 1.0000000e+000 

I primi 4 attributi specificano i valori multibanda del pixel e l’ultimo attributo specifica l’etichetta della class. È ansible convertirlo in formato RGB? Ho il codice Java per classificare un’immagine basata sui valori RGB.

Se ho capito bene la risposta è SI, ma solo per chiarimenti questo è il modo in cui lo vedo:

Hai 4 intensità di bande e hai bisogno del valore del colore RGB da esso. L’ultimo numero non è correlato al colore in alcun modo, quindi ignoralo.

  1. Cosa hai bisogno di sapere

    se l’intensità è lineare o no e se non lineare come convertirlo in scala lineare. È necessario conoscere la lunghezza d’onda o il colore RGB per ogni banda utilizzata

  2. come convertire

    prendi ogni RGB di banda e moltiplicalo per la sua intensità lineare e sum tutti insieme.

     color_rgb = band0_rgb*band0_intensity+...+band3_rgb*band3_intensity 
  3. come ottenere l’RGB utilizzabile della banda dalla lunghezza d’onda

    ottenere il colore della luce della lunghezza d’onda mediante i valori RGB dello spettro visibile e ridimensionare il colore, quindi se si aggiungono tutte le bande insieme con la stessa intensità si ottiene il colore bianco.

Sto usando bande distribuite uniformsmente attraverso lo spettro visibile per il rendering multi spettrale e questo è il modo in cui lo faccio in C ++:

 //--------------------------------------------------------------------------- //--- multi band rendering -------------------------------------------------- //--------------------------------------------------------------------------- const int _Bands=10; // number of bands used double _Band_RGB[_Bands][3]; // RGB of each band with white bias correction double _Band_Wavelength[_Bands]; // wavelength of each band //--------------------------------------------------------------------------- void wavelength2RGB(double *rgb,double lambda) // RGB <0,1> <- lambda <400e-9,700e-9> [m] { double r=0.0,g=0.0,b=0.0,t; if ((lambda>=400.0e-9)&&(lambda<410.0e-9)) { t=(lambda-400.0e-9)/(410.0e-9-400.0e-9); r= +(0.33*t)-(0.20*t*t); } else if ((lambda>=410.0e-9)&&(lambda<475.0e-9)) { t=(lambda-410.0e-9)/(475.0e-9-410.0e-9); r=0.14 -(0.13*t*t); } else if ((lambda>=545.0e-9)&&(lambda<595.0e-9)) { t=(lambda-545.0e-9)/(595.0e-9-545.0e-9); r= +(1.98*t)-( t*t); } else if ((lambda>=595.0e-9)&&(lambda<650.0e-9)) { t=(lambda-595.0e-9)/(650.0e-9-595.0e-9); r=0.98+(0.06*t)-(0.40*t*t); } else if ((lambda>=650.0e-9)&&(lambda<700.0e-9)) { t=(lambda-650.0e-9)/(700.0e-9-650.0e-9); r=0.65-(0.84*t)+(0.20*t*t); } if ((lambda>=415.0e-9)&&(lambda<475.0e-9)) { t=(lambda-415.0e-9)/(475.0e-9-415.0e-9); g= +(0.80*t*t); } else if ((lambda>=475.0e-9)&&(lambda<590.0e-9)) { t=(lambda-475.0e-9)/(590.0e-9-475.0e-9); g=0.8 +(0.76*t)-(0.80*t*t); } else if ((lambda>=585.0e-9)&&(lambda<639.0e-9)) { t=(lambda-585.0e-9)/(639.0e-9-585.0e-9); g=0.84-(0.84*t) ; } if ((lambda>=400.0e-9)&&(lambda<475.0e-9)) { t=(lambda-400.0e-9)/(475.0e-9-400.0e-9); b= +(2.20*t)-(1.50*t*t); } else if ((lambda>=475.0e-9)&&(lambda<560.0e-9)) { t=(lambda-475.0e-9)/(560.0e-9-475.0e-9); b=0.7 -( t)+(0.30*t*t); } rgb[0]=r; rgb[1]=g; rgb[2]=b; } //--------------------------------------------------------------------------- double wavelength2int(double lambda) // white bias correction intensity <0,1+> <- lambda <400e-9,700e-9> [m] { // this is mine empirically deduced equation and works for evenly distributed bands const double a0= 8.50/double(_swColorWavelengths);// for 3-5 bands low bias, >5 almost no visible bias present const double a1=-27.37/double(_swColorWavelengths); const double a2=+26.35/double(_swColorWavelengths); double t=divide(lambda-400e-9,700e-9-400e-9); return (a0)+(a1*t)+(a2*t*t); } //--------------------------------------------------------------------------- void init_multiband_colors() // init evenly distributed bands through visible spectrum range { double l,dl; int ix; l=405e-9; dl=695e-9; dl=divide(dl-l,_Bands); l+=0.5*dl; for (ix=_Bands-1;ix>=0;ix--,l+=dl) // init colors and wavelengths (multispectral rendering) { _Band_Wavelength[ix]=l; wavelength2RGB(_Band_RGB[ix],l); _Band_RGB[ix][0]*=wavelength2int(l); // white bias removal _Band_RGB[ix][1]*=wavelength2int(l); _Band_RGB[ix][2]*=wavelength2int(l); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- 

Ecco come appare:

colori multi spettrali che mescolano il bias bianco

la prima riga mostra il numero e il colore delle bande utilizzate mentre la seconda fa parte dell’immagine renderizzata in bianco usando il rendering multi spettrale. Come puoi vedere c’è un piccolo pregiudizio bianco. Faccio quella formula per essere il più vicino al bianco che può essere per qualsiasi numero di bande utilizzate (>=3) . L’idea è che se hai il rumore bianco (tutte le frequenze con la stessa intensità), allora hai un colore bianco. Quindi quando aggiungi tutti i colors delle bande utilizzate dovresti avere il colore bianco. Quindi ho sperimentato empiricamente con il ridimensionamento dei colors in funzione della lunghezza d’onda e questo è quello che ho scoperto …

se le tue band non sono equamente distribuite

Quindi è necessario integrare tutte le bande equamente distribuite che coprono, ad esempio:

  1. imposta i colors per 100 bande
  2. dividili per i tuoi 4 gruppi in gruppi
  3. integrare ciascun gruppo per ottenere il colore della banda
  4. ridimensionare i colors della banda integrata su una scala utilizzabile comune come /=100
  5. controlla il pregiudizio bianco