Class: ColorDiff::Ciede2000
- Inherits:
-
Object
- Object
- ColorDiff::Ciede2000
- Defined in:
- lib/color_diff/ciede2000.rb
Class Method Summary collapse
- .a_hp_f(c1, c2, h1p, h2p) ⇒ Object
- .degrees(n) ⇒ Object
- .dhp_f(c1, c2, h1p, h2p) ⇒ Object
- .diff(c1, c2) ⇒ Object
- .hp_f(x, y) ⇒ Object
- .radians(n) ⇒ Object
Class Method Details
.a_hp_f(c1, c2, h1p, h2p) ⇒ Object
100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/color_diff/ciede2000.rb', line 100 def self.a_hp_f(c1, c2, h1p, h2p) sum = h1p + h2p diff = h1p - h2p if c1 * c2 == 0 sum elsif diff.abs <= 180 sum / 2.0 elsif diff.abs > 180 && sum < 360 (sum + 360) / 2.0 elsif diff.abs > 180 && sum >= 360 (sum - 360) / 2.0 end end |
.degrees(n) ⇒ Object
67 68 69 |
# File 'lib/color_diff/ciede2000.rb', line 67 def self.degrees(n) 180 / Math::PI * n end |
.dhp_f(c1, c2, h1p, h2p) ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/color_diff/ciede2000.rb', line 86 def self.dhp_f(c1, c2, h1p, h2p) diff = h2p - h1p if c1 * c2 == 0 0 elsif diff.abs <= 180 diff elsif diff > 180 diff - 360 elsif diff < -180 diff + 360 end end |
.diff(c1, c2) ⇒ Object
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/color_diff/ciede2000.rb', line 3 def self.diff(c1, c2) # get lab values for color 1 l1 = c1.l a1 = c1.a b1 = c1.b # get lab values for color 2 l2 = c2.l a2 = c2.a b2 = c2.b # weight factors kl = 1 kc = 1 kh = 1 # Step 1: Calculate c1p, c2p, h1p, h2p # c1 = Math.sqrt((a1 ** 2) + (b1 ** 2)) c2 = Math.sqrt((a2 ** 2) + (b2 ** 2)) a_c1_c2 = (c1 + c2) / 2.0 g = 0.5 * (1 - Math.sqrt((a_c1_c2 ** 7.0) / ((a_c1_c2 ** 7.0) + (25.0 ** 7.0)))) a1p = (1.0 + g) * a1 a2p = (1.0 + g) * a2 c1p = Math.sqrt((a1p ** 2) + (b1 ** 2)) c2p = Math.sqrt((a2p ** 2) + (b2 ** 2)) h1p = hp_f(b1, a1p) h2p = hp_f(b2, a2p) # Step 2: calculate dlp, dcp, dhp # dlp = l2 - l1 dcp = c2p - c1p dhp_tmp = dhp_f(c1, c2, h1p, h2p) dhp = 2 * Math.sqrt(c1p * c2p) * Math.sin(radians(dhp_tmp) / 2.0) # Step 3: calculate CIEDE2000 Color-Difference # a_l = (l1 + l2) / 2.0 a_cp = (c1p + c2p) / 2.0 a_hp = a_hp_f(c1, c2, h1p, h2p) t = 1 - 0.17 * Math.cos(radians(a_hp - 30)) + 0.24 * Math.cos(radians(2 * a_hp)) + 0.32 * Math.cos(radians(3 * a_hp + 6)) - 0.20 * Math.cos(radians(4 * a_hp - 63)) d_ro = 30 * Math.exp(-(((a_hp - 275) / 25) ** 2)) rc = Math.sqrt((a_cp ** 7.0) / ((a_cp ** 7.0) + (25.0 ** 7.0))) sl = 1 + ((0.015 * ((a_l - 50) ** 2)) / Math.sqrt(20 + ((a_l - 50) ** 2.0))) sc = 1 + 0.045 * a_cp sh = 1 + 0.015 * a_cp * t rt = -2 * rc * Math.sin(radians(2 * d_ro)) de = Math.sqrt( ((dlp / (sl * kl)) ** 2) + ((dcp / (sc * kc)) ** 2) + ((dhp / (sh * kh)) ** 2) + rt * (dcp / (sc * kc)) * (dhp / (sh * kh)) ) de end |
.hp_f(x, y) ⇒ Object
75 76 77 78 79 80 81 82 83 84 |
# File 'lib/color_diff/ciede2000.rb', line 75 def self.hp_f(x, y) 0 if x.zero? && y.zero? tmphp = degrees Math.atan2(x, y) if tmphp >= 0 tmphp else tmphp + 360 end end |
.radians(n) ⇒ Object
71 72 73 |
# File 'lib/color_diff/ciede2000.rb', line 71 def self.radians(n) Math::PI / 180 * n end |