多波段图像光栅到RGB

我有一个图像数据集,它是一个arff格式的多波段数据集。 它看起来像这样:

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 

前4个属性指定像素的多波段值,最后一个属性指定类标签。 是否可以将其转换为RGB格式? 我有java代码根据RGB值对图像进行分类。

如果我做得对,那么答案是肯定的,但只是为了澄清这是我的看法:

你有4个波段的强度,你需要RGB颜色值。 最后一个数字与颜色无关,因此请忽略它。

  1. 你需要知道什么

    如果强度是线性的,如果是非线性的,如何将其转换为线性标度。 您需要知道每个使用的波段的波长或RGB颜色

  2. 如何转换

    取每个带的RGB并将其乘以其线性强度,然后将它们全部加在一起。

     color_rgb = band0_rgb*band0_intensity+...+band3_rgb*band3_intensity 
  3. 如何从波长获得可用的带宽RGB

    通过可见光谱的RGB值获得波长的光的颜色并重新缩放颜色,因此如果将所有的条带以相同的强度添加在一起,则会得到白色。

我通过可见光谱使用均匀分布的频带进行多光谱渲染,这就是我在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); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- 

这是它的样子:

多光谱颜色混合白色偏差

第一行显示使用的带的数量和颜色,第二行是使用多光谱渲染的白色渲染图像的一部分。 你可以看到一个小的白色偏见。 我将该公式设置为与使用的任意数量的波段(>=3)一样接近白色。 这个想法是,如果你有白噪声(所有频率具有相同的强度),那么你得到一个白色。 所以当添加所有使用的乐队颜色时,你应该有白色。 所以我根据经验尝试通过波长函数来缩放颜色,这就是我想出来的……

如果您的乐队分布不均匀

然后,您需要集成它们覆盖的所有均匀分布的波段,例如:

  1. 设置100个乐队的颜色
  2. 将你的4个乐队分成小组
  3. 整合每组以获得带颜色
  4. 将积分带颜色缩放到常用的比例,如/=100
  5. 检查白色偏见