RGB 到 XYZ,然后 XYZ 到 LAB android(JAVA)
RGB to XYZ and then XYZ to LAB in android(JAVA)
我已经计算了图像的 R、G 和 B 值,并进行了一些计算以获得 LAB 颜色的 L、a 和 b 值space。现在我如何在 Android 工作室中使用这些 L、a 和 b 值将我的 RGB 图像转换为 LAB 图像(OpenCV 的内置函数除外,因为我想先将 RGB 转换为 XYZ,然后最后将 XYZ 转换为 LAB 颜色 space)?
将 RGB 值传递给此 class 的函数,这将 return 包含 LAB[=15= 值的数组]
public class CIELab {
String TAG ="RGB";
public double[] rgbToLab(int R, int G, int B) {
double[] lab=new double[3];
double r, g, b, X, Y, Z, xr, yr, zr;
ColorUtils.RGBToLAB(R,G,B,lab);
//Core.absdiff();
// D65/2°
double Xr = 95.047;
double Yr = 100.0;
double Zr = 108.883;
// --------- RGB to XYZ ---------//
r = R/255.0;
g = G/255.0;
b = B/255.0;
if (r > 0.04045)
r = Math.pow((r+0.055)/1.055,2.4);
else
r = r/12.92;
if (g > 0.04045)
g = Math.pow((g+0.055)/1.055,2.4);
else
g = g/12.92;
if (b > 0.04045)
b = Math.pow((b+0.055)/1.055,2.4);
else
b = b/12.92 ;
r*=100;
g*=100;
b*=100;
Log.d(TAG,"R:"+r+" G:"+g+" B:"+b);
X = 0.4124*r + 0.3576*g + 0.1805*b;
Y = 0.2126*r + 0.7152*g + 0.0722*b;
Z = 0.0193*r + 0.1192*g + 0.9505*b;
// --------- XYZ to Lab --------- //
xr = X/Xr;
yr = Y/Yr;
zr = Z/Zr;
if ( xr > 0.008856 )
xr = (float) Math.pow(xr, 1/3.);
else
xr = (float) ((7.787 * xr) + 16 / 116.0);
if ( yr > 0.008856 )
yr = (float) Math.pow(yr, 1/3.);
else
yr = (float) ((7.787 * yr) + 16 / 116.0);
if ( zr > 0.008856 )
zr = (float) Math.pow(zr, 1/3.);
else
zr = (float) ((7.787 * zr) + 16 / 116.0);
double[] lab = new double[3];
lab[0] = (116*yr)-16;
lab[1] = 500*(xr-yr);
lab[2] = 200*(yr-zr);
return lab;
}
}
我已经计算了图像的 R、G 和 B 值,并进行了一些计算以获得 LAB 颜色的 L、a 和 b 值space。现在我如何在 Android 工作室中使用这些 L、a 和 b 值将我的 RGB 图像转换为 LAB 图像(OpenCV 的内置函数除外,因为我想先将 RGB 转换为 XYZ,然后最后将 XYZ 转换为 LAB 颜色 space)?
将 RGB 值传递给此 class 的函数,这将 return 包含 LAB[=15= 值的数组]
public class CIELab {
String TAG ="RGB";
public double[] rgbToLab(int R, int G, int B) {
double[] lab=new double[3];
double r, g, b, X, Y, Z, xr, yr, zr;
ColorUtils.RGBToLAB(R,G,B,lab);
//Core.absdiff();
// D65/2°
double Xr = 95.047;
double Yr = 100.0;
double Zr = 108.883;
// --------- RGB to XYZ ---------//
r = R/255.0;
g = G/255.0;
b = B/255.0;
if (r > 0.04045)
r = Math.pow((r+0.055)/1.055,2.4);
else
r = r/12.92;
if (g > 0.04045)
g = Math.pow((g+0.055)/1.055,2.4);
else
g = g/12.92;
if (b > 0.04045)
b = Math.pow((b+0.055)/1.055,2.4);
else
b = b/12.92 ;
r*=100;
g*=100;
b*=100;
Log.d(TAG,"R:"+r+" G:"+g+" B:"+b);
X = 0.4124*r + 0.3576*g + 0.1805*b;
Y = 0.2126*r + 0.7152*g + 0.0722*b;
Z = 0.0193*r + 0.1192*g + 0.9505*b;
// --------- XYZ to Lab --------- //
xr = X/Xr;
yr = Y/Yr;
zr = Z/Zr;
if ( xr > 0.008856 )
xr = (float) Math.pow(xr, 1/3.);
else
xr = (float) ((7.787 * xr) + 16 / 116.0);
if ( yr > 0.008856 )
yr = (float) Math.pow(yr, 1/3.);
else
yr = (float) ((7.787 * yr) + 16 / 116.0);
if ( zr > 0.008856 )
zr = (float) Math.pow(zr, 1/3.);
else
zr = (float) ((7.787 * zr) + 16 / 116.0);
double[] lab = new double[3];
lab[0] = (116*yr)-16;
lab[1] = 500*(xr-yr);
lab[2] = 200*(yr-zr);
return lab;
}
}