2016-04-14 17 views
-1

DE2000 Formula'u temel alarak CIE Renk Farkı DeltaE 2000'i Hesaplamaya çalışıyorum. Web sitesinde verilen formüle göre yaptım, ama garip delta E değerlerini alıyorum. Yanlış gittiğim yerde kafam karıştı. Ben birçok kez kontrol ettim ama ben bulamadım. Birisi benim kodumun hangi kısmının sorun olduğunu söyle.Renk Farkı 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

Numara denetimi için yararlı olabilecek bir referans Python uygulamasına sahibiz: https://github.com/colour-science/colour/blob/develop/colour/difference/delta_e.py#L162, ayrıca bir Matlab var Burada uygulama: http://www.ece.rochester.edu/~gsharma/ciede2000/dataNprograms/deltaE2000.m –

cevap

0

sizin hesaplamalarda bazı sorunlar vardır:

a) if ((h1_dash - h2_dash)> radtodeg (pi)): Eğer bu abs almak gerekmez?

b) 20 * radtodeg (cos (4 * H_bar_dash + 63): İhtiyacınız -63 burada

c) Ben senin if-else yapısı düzgün üç davalarına bakan varsayalım; Bunu kontrol etmek gerekebilir:

.... başka DE_h_dash = h2_dash - h1_dash - radtodeg (2 * pi)

d) sin o kadar gerek dönüştürmek için radyan cinsinden değil derecelik bir sayıdır burada:

radtodeg(sin(DE_h_dash/2)) 

e) burada aynı: radtodeg (sin (2 * DE_angle))

f) Ben cos/sin derece almak farz; Birçoğunun her yerde radyan nedir derecelerinin ne olduğunu iki kere kontrol etmeniz gerekir.