多波段图像栅格为RGB多波段图像栅格为RGB(Multi-Band Image raster to

2019-05-12 12:58发布

我有一个图像数据集,其是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值的图像进行分类。

Answer 1:

如果我得到它的权利那么答案是肯定的 ,但只是为了澄清这就是我看待它:

你有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. 检查白偏置


文章来源: Multi-Band Image raster to RGB