多波段图像光栅到 RGB
Multi-Band Image raster to 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 个属性指定像素的多波段值,最后一个属性指定 class 标签。是否可以将其转换为 RGB 格式?我有 java 代码来 class 根据 RGB 值验证图像。
如果我做对了,那么答案是 是 但为了澄清,这是我的看法:
你有 4 个波段强度,你需要 RGB 颜色值。最后一个数字与颜色没有任何关系,所以请忽略它。
你需要知道的
强度是否是线性的,如果是非线性的如何将其转换为线性刻度。您需要知道使用的每个波段的波长或 RGB 颜色
如何转换
将波段的每个 RGB 乘以其线性强度,然后将它们相加。
color_rgb = band0_rgb*band0_intensity+...+band3_rgb*band3_intensity
如何从波长
获取波段的可用RGB
通过 RGB values of visible spectrum 获得波长的光的颜色并重新调整颜色,因此如果将所有具有相同强度的波段加在一起,您将得到白色。
我在可见光谱中使用均匀分布的波段进行多光谱渲染,这就是我在 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)
。这个想法是,如果你有白噪声(所有频率都具有相同的强度)那么你就会得到白色。所以当添加所有使用的波段颜色时,你应该有白色。因此,我根据经验对根据波长的函数缩放颜色进行了实验,这就是我想出的...
如果你的频段分布不均匀
然后你需要整合它们覆盖的所有均匀分布的波段,例如:
- 为 100 个波段设置颜色
- 将它们按您的 4 个波段分组
- 对每个组进行积分以获得波段颜色
- 将集成的波段颜色缩放到常见的可用比例,如
/=100
- 检查白色偏差
我有一个图像数据集,它是 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 个属性指定像素的多波段值,最后一个属性指定 class 标签。是否可以将其转换为 RGB 格式?我有 java 代码来 class 根据 RGB 值验证图像。
如果我做对了,那么答案是 是 但为了澄清,这是我的看法:
你有 4 个波段强度,你需要 RGB 颜色值。最后一个数字与颜色没有任何关系,所以请忽略它。
你需要知道的
强度是否是线性的,如果是非线性的如何将其转换为线性刻度。您需要知道使用的每个波段的波长或 RGB 颜色
如何转换
将波段的每个 RGB 乘以其线性强度,然后将它们相加。
color_rgb = band0_rgb*band0_intensity+...+band3_rgb*band3_intensity
如何从波长
获取波段的可用RGB通过 RGB values of visible spectrum 获得波长的光的颜色并重新调整颜色,因此如果将所有具有相同强度的波段加在一起,您将得到白色。
我在可见光谱中使用均匀分布的波段进行多光谱渲染,这就是我在 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)
。这个想法是,如果你有白噪声(所有频率都具有相同的强度)那么你就会得到白色。所以当添加所有使用的波段颜色时,你应该有白色。因此,我根据经验对根据波长的函数缩放颜色进行了实验,这就是我想出的...
如果你的频段分布不均匀
然后你需要整合它们覆盖的所有均匀分布的波段,例如:
- 为 100 个波段设置颜色
- 将它们按您的 4 个波段分组
- 对每个组进行积分以获得波段颜色
- 将集成的波段颜色缩放到常见的可用比例,如
/=100
- 检查白色偏差