Я хочу написать программу, которая будет рассчитывать DeltaE (расстояние между цветами) в AnLab цветовое пространство.
Формула здесь: Кликните сюда, где deltaVy — это разница между координатами яркости, а delta (Vx-Vy) и delta (Vz-Vy) — это различия между координатами цвета.
Так,
1. Как рассчитать deltaVx, deltaVy, deltaVz?
2. Может быть, у кого-то есть больше информации об этом цветовом пространстве. Я был бы признателен.
До сих пор я делал вычисления от RGB до XYZ, но застрял в вычислениях deltaVx, Vy, Vz.
РЕДАКТИРОВАТЬ:
После некоторых поисков я обнаружил, что deltaVx, Vy, Vz происходит от добавления сжимающихся координат к XYZ. Но после всех вычислений я не знаю, почему расстояние неверно (очень большое значение). Я тоже редактировал свой код, поэтому теперь он реализовал формулы. Также для целей тестирования я поставил очень похожие цвета (теперь deltaE должно быть небольшим значением, но что-то не так).
Отредактированный код до сих пор:
#include <iostream>
#include <math.h>
using namespace std;
class colorRGB
{
public:
double R1, G1, B1; // RGB colors
double X, Y, Z; // vectors
double Vx, Vy, Vz;
double L, a, b;
colorRGB(double R, double G, double B) //Make new color
{
this->R1 = R;
this->G1 = G;
this->B1 = B;
}
void wypisz()
{
cout << "X: " << X << " " << "Y: " << Y << " " << "Z: " << Z << endl;
cout << "Vx: " << Vx << " Vy: " << Vy << " Vz: " << Vz << endl;
cout << "L: " << L << " a: " << a << " b: " << b << endl;
cout << "--------------------------------------------------------------" << endl;
}
void calcLab(double pVx, double pVy, double pVz) // calulate L*ab
{
L = 9.2*(pVy);
a = 40 * (pVx - pVy);
b = 16 * (pVy - pVz);
}
void RGBtoXYZ()
{
double R = R1 / 255; // R from 0 to 255 etc.
double G = G1 / 255;
double B = B1 / 255;
if (R > 0.04045) { // R to X
R = (R + 0.055) / 1.055;
R = pow(R, 2.4);
}
else R = R / 12.92;
if (G > 0.04045) { // G to Y
G = (G + 0.055) / 1.055;
G = pow(G, 2.4);
}
else G = G / 12.92;
if (B > 0.04045) { // B to Z
B = (B + 0.055) / 1.055;
B = pow(B, 2.4);
}
else B = B / 12.92;
R = R * 100;
G = G * 100;
B = B * 100;
//Illuminant = D65
X = (R * 0.4124) + (G * 0.3576) + (B * 0.1805);
Y = (R * 0.2126) + (G * 0.7152) + (B * 0.0722);
Z = (R * 0.0193) + (G * 0.1192) + (B * 0.9505);
X = X - Y; // subtract from X and Z (prepare variables to further calculations)
Z = Z - Y;
Vx = X + 0.4124 + 0.3576 + 0.1805; // add shrinking coordinates
Vy = Y + 0.2126 + 0.7152 + 0.0722;
Vz = Z + 0.0193 + 0.1192 + 0.9505;
calcLab(Vx, Vy, Vz);
}
};
void calcDeltaVar(colorRGB *color1, colorRGB *color2) {
int x = 0;
double dE;
double ins;
double dVy = color1->Vy - color2->Vy;
double dVxVy = color1->Vx - color2->Vy;
double dVzVy = color1->Vz - color2->Vy;
ins = 0.23*(pow(dVy, 2)) + pow(dVxVy, 2) + 0.4*(pow(dVzVy, 2));
dE = 40 * (sqrt(ins));
x++;
cout << "Delta Ean for pair " << x << " is: " << dE << endl;
};int main()
{
colorRGB rgb(255.0, 255.0, 255.0);
colorRGB rgb1(254.0, 254.0, 254.0);
rgb.RGBtoXYZ();
rgb.wypisz();
rgb1.RGBtoXYZ();
rgb1.wypisz();
calcDeltaVar(&rgb, &rgb1);
return 0;
}
Заранее спасибо 🙂
Задача ещё не решена.
Других решений пока нет …