2016-04-14 7 views
-1

Ich versuche die CIE Farbdifferenz DeltaE 2000 basierend auf DE2000 Formula zu berechnen. Ich habe nach der Formel auf der Website getan, aber ich bekomme seltsame Delta E-Werte. Ich bin verwirrt, wo ich falsch gelaufen bin. Ich habe viele Male überprüft, aber ich kann den Fehler nicht finden. Jemand kann mir sagen, welcher Teil meines Codes ein Problem hat.Farbdifferenz DeltaE 2000

function DE_2K = CIEDE2000(Lab1,Lab2) 
labuno=Lab1 
labdos=Lab2 
L1=labuno(1) 
a1=labuno(2) 
b1=labuno(3) 
L2=labdos(1) 
a2=labdos(2) 
b2=labdos(3) 

%******************************************************************* 
%     Definition for CIE DE2000 
%******************************************************************* 
L_bar_dash=(L1+L2)/2; 
C1 = sqrt((a1)^2+(b1)^2) 
C2 = sqrt((a2)^2+(b2)^2) 
C_bar = (C1+C2)/2 
G = (1 -sqrt(((C_bar)^7)/((C_bar)^7+(25)^7))/2) 
a1_dash = a1*(1+G) 
a2_dash = a2*(1+G) 
C1_dash = sqrt((a1_dash)^2+(b1)^2) 
C2_dash = sqrt((a2_dash)^2+(b2)^2) 
C_bar_dash = (C1_dash + C2_dash)/2 

if (radtodeg(atan(b1/a1_dash)) >= 0) h1_dash = radtodeg(atan(b1/a1_dash)) 
else       h1_dash = radtodeg(atan(b1/a1_dash)) + radtodeg(2*pi) 
end 

if (radtodeg(atan(b2/a2_dash)) >= 0) h2_dash = radtodeg(atan(b2/a2_dash)) 
else       h2_dash = radtodeg(atan(b2/a2_dash)) + radtodeg(2*pi) 
end 

if ((h1_dash - h2_dash) > radtodeg(pi)) H_bar_dash = (h1_dash + h2_dash + radtodeg(2*pi))/2 
else       H_bar_dash = (h1_dash + h2_dash)/2 
end 

    T = 1 - 0.17*radtodeg(cos(H_bar_dash-radtodeg(pi/6)))+0.24*radtodeg(cos(2*H_bar_dash))+0.32*radtodeg(cos(3*H_bar_dash + radtodeg(pi/30)))- 0.20*radtodeg(cos(4*H_bar_dash + 63)) 

if ((abs(h2_dash - h1_dash)) <= radtodeg(pi))      DE_h_dash = h2_dash - h1_dash 
elseif(abs(h2_dash - h1_dash) > radtodeg(pi) && h2_dash <= h1_dash) DE_h_dash = h2_dash - h1_dash + radtodeg(2*pi) 
    else                DE_h_dash = h2_dash - h1_dash - radtodeg(2*pi)  
    end 

    DE_L_dash = L2 - L1 
    DE_C_dash = C2_dash - C1_dash 
    DE_H_dash = 2 * sqrt(C1_dash * C2_dash) * radtodeg(sin(DE_h_dash/2)) 

    S_L = 1 + ((0.015 * (L_bar_dash - 50)^2)/sqrt(20 + (L_bar_dash - 50)^2)) 
    S_C = 1 + (0.045 * C_bar_dash) 
    S_H = 1 + (0.015 * C_bar_dash * T) 

    DE_angle = 30 * exp(- ((H_bar_dash - 275)/25)^2) 

    R_C = 2 * sqrt((C_bar_dash)^7/((C_bar_dash)^7 + (25)^7)) 

    R_T = - R_C * radtodeg(sin(2 * DE_angle)) 

    K_L = 1 
    K_C = 1 
    K_H = 1 

    DE_2K = sqrt((DE_L_dash/(K_L * S_L))^2 + (DE_C_dash/(K_C * S_C))^2 + (DE_H_dash/(K_H * S_H))^2 + (R_T * (DE_C_dash/(K_C * S_C)) * (DE_H_dash/(K_H * S_H)))) 

    end 
+0

Wir haben eine Referenz Python-Implementierung, die für die Überprüfung der Nummer nützlich sein könnte: https://github.com/colour-science/colour/blob/develop/colour/difference/delta_e.py#L162, gibt es auch ein Matlab Implementierung hier: http://www.ece.rochester.edu/~gsharma/ciede2000/dataNprograms/deltaE2000.m –

Antwort

0

Es gibt einige Probleme in Ihren Berechnungen:

a) if ((h1_dash - h2_dash)> radtodeg (pi)): nicht müssen Sie die abs dieses nehmen?

b) 20 * radtodeg (cos (4 * H_bar_dash + 63): Sie brauchen -63 hier

c) Ich nehme an, Ihre if-else-Struktur korrekt die drei Fälle behandelt; Sie können das überprüfen müssen:

.... sonst DE_h_dash = h2_dash - h1_dash - radtodeg (2 * pi)

d) sin eine Zahl von nicht in Grad, nicht in Radianten so dass keine Notwendigkeit zu konvertieren hier:

radtodeg(sin(DE_h_dash/2)) 

e) hier gilt das gleiche: radtodeg (sin (2 * DE_angle))

f) ich nehme an cos/sin Grad nehmen; Sie müssen viele überprüfen, was Grad ist, was ist Radianten überall.