Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
 Welcome to our latest new user maak ! (Registered 2024-04-18) You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > C64 color comparison
2016-10-07 19:54
Ghostrider
Administrator

Posts: 43
C64 color comparison

So, I'm playing around with something that utilizes color differences, and I wanted my code to be as good as I could make it. That led me into a little research, resulting in the below table (and documentation) in my code. I have no idea whether others have done anything like this, I just thought I'd share it in case it could be useful for someone. (Tho I guess there could be someone who doesn't like the Pepto palette). The color-differences range from 0 to 100, as can be seen from the difference between black and white.

/* COLOR-DIFFERENCE TABLE, measuring how alike 2 colors look to the human eye.
 *
 * Created by translating the correct C64 RGB-palette (as thoroughly researched
 * by Philip 'Pepto' Timmermann, and published in the "Commodore VIC-II Color
 * Analysis"):
 *
 * Black      White      Red        Cyan       Purple     Green      Blue
 * 00 00 00   ff ff ff   68 37 2b   70 a4 b2   6f 3d 86   58 8d 43   35 28 79
 *
 * Yellow     Orange     Brown      Lt Red     Dark Grey  Med Grey   Lt green
 * b8 c7 6f   6f 4f 25   43 39 00   9a 67 59   44 44 44   6c 6c 6c   9a d2 84
 *
 * Lt Blue    Lt Grey
 * 6c 5e b5   95 95 95
 *
 *
 * into the intended perceptually uniform CIE L*a*b* (CIELAB) color space via
 * Photoshop CS5:
 *
 * Black      White     Red       Cyan        Purple     Green      Blue
 * 0 0 0      100 0 0   29 21 18  64 -15 -13  35 32 -32  54 -29 33  22 25 -45
 *
 * Yellow     Orange    Brown     Lt Red      Dark Grey  Med Grey   Lt green
 * 78 -15 42  36 10 30  24 0 33   49 20 17    29 0 0     46 0 0     79 -29 33
 *
 * Lt Blue    Lt Grey
 * 44 22 -45  62 0 0
 *
 * and finally, using the above CIE L*a*b* values, computing the
 * color-differences between any two C64 colors. This was done using a Matlab
 * implementation of the CIEDE2000 color-difference formula, published by
 * Gaurav Sharma at the University of Rochester. As of 2016, this should be the
 * best visual-color-difference algorithm available.
 */
float colordiff[16][16] = {
	{0.00000, 100.00000, 27.29927, 53.26580, 33.36977, 46.54540, 27.91278,
	 71.32101, 30.91014, 24.36201, 40.40526, 18.97503, 32.86756, 72.80412,
	 39.20668, 48.53537},

	{100.00000, 0.00000, 61.97257, 29.34183, 56.93753, 40.24329, 71.85536,
	 26.50693, 54.14554, 67.73280, 42.05900, 58.78266, 40.33892, 26.72007,
	 48.58504, 26.02320},

	{27.29927, 61.97257, 0.00000, 53.66487, 28.72115, 44.76018, 33.08048,
	 56.92023, 14.00707, 21.06269, 17.36067, 19.62648, 24.37162, 61.72667,
	 35.29397, 37.10740},

	{53.26580, 29.34183, 53.66487, 0.00000, 38.60884, 30.82463, 43.73660,
	 34.43323, 43.05106, 48.64282, 43.62700, 37.61613, 23.58306, 31.63124,
	 27.79863, 16.38323},

	{33.36977, 56.93753, 28.72115, 38.60884, 0.00000, 63.67504, 13.95492,
	 69.94213, 40.00703, 47.52039, 30.66366, 24.06466, 25.52344, 73.27806,
	 13.99189, 35.70972},

	{46.54540, 40.24329, 44.76018, 30.82463, 63.67504, 0.00000, 55.77398,
	 21.74555, 31.80033, 31.80176, 38.51345, 32.30988, 24.56106, 20.17950,
	 49.67790, 24.32458},

	{27.91278, 71.85536, 33.08048, 43.73660, 13.95492, 55.77398, 0.00000,
	 80.90839, 43.71174, 48.31631, 39.23529, 24.73801, 31.07341, 74.86371,
	 17.74707, 43.54902},

	{71.32101, 26.50693, 56.92023, 34.43323, 69.94213, 21.74555, 80.90839,
	 0.00000, 42.97277, 54.79072, 39.45047, 52.55362, 35.47933, 9.66140,
	 64.56892, 25.73341},

	{30.91014, 54.14554, 14.00707, 43.05106, 40.00703, 31.80033, 43.71174,
	 42.97277, 0.00000, 12.50487, 17.45413, 19.77869, 20.96770, 47.52027,
	 42.70317, 32.11929},

	{24.36201, 67.73280, 21.06269, 48.64282, 47.52039, 31.80176, 48.31631,
	 54.79072, 12.50487, 0.00000, 29.37105, 19.29903, 26.19519, 57.58782,
	 50.39976, 39.71692},

	{40.40526, 42.05900, 17.36067, 43.62700, 30.66366, 38.51345, 39.23529,
	 39.45047, 17.45413, 29.37105, 0.00000, 25.82295, 19.35305, 45.64642,
	 32.88847, 22.69667},

	{18.97503, 58.78266, 19.62648, 37.61613, 24.06466, 32.30988, 24.73801,
	 52.55362, 19.77869, 19.29903, 25.82295, 0.00000, 14.44913, 53.39135,
	 26.98485, 31.49222},

	{32.86756, 40.33892, 24.37162, 23.58306, 25.52344, 24.56106, 31.07341,
	 35.47933, 20.96770, 26.19519, 19.35305, 14.44913, 0.00000, 36.41365,
	 23.94736, 15.38462},

	{72.80412, 26.72007, 61.72667, 31.63124, 73.27806, 20.17950, 74.86371,
	 9.66140, 47.52027, 57.58782, 45.64642, 53.39135, 36.41365, 0.00000,
	 57.25129, 26.64841},

	{39.20668, 48.58504, 35.29397, 27.79863, 13.99189, 49.67790, 17.74707,
	 64.56892, 42.70317, 50.39976, 32.88847, 26.98485, 23.94736, 57.25129,
	 0.00000, 29.63502},

	{48.53537, 26.02320, 37.10740, 16.38323, 35.70972, 24.32458, 43.54902,
	 25.73341, 32.11929, 39.71692, 22.69667, 31.49222, 15.38462, 26.64841,
	 29.63502, 0.00000}
};
 
... 5 posts hidden. Click here to view all posts....
 
2016-10-09 19:14
Ghostrider
Administrator

Posts: 43
Copyfault, actually I haven't done the "early step" you mention. And you are right, the formula is _a little bit_ complicated, haha :D

I only used a slightly modified version of the Matlab sources to calculate the table I've shown.

But since the Matlab implementation of the formula is less than 2 pages of code, it shouldn't be too hard to translate it to C (or whatever) line by line.
One just has to also find an RGB-to-CIELAB conversion formula (I used Photoshop), since that's what the CIEDE2000-formula eats - but I guess such a formula should be quite possible to find. I haven't looked into this.

In case you didn't notice, the code is under the "Matlab function" link on the page I linked to.
2016-10-09 21:10
Copyfault

Registered: Dec 2001
Posts: 466
Ok, thanks for the fast reply! Hmm, maybe I should give it a try transferring the MATLAB-code to e.g. Kickass line-by-line... let's see.

On the German Wikipedia pages I found some information on how to convert from sRGB to CIEL*a*b*. This is done by
1. a linear transformation to convert sRGB to CIEXYZ-coordinates -plus-
2. a nonlinear transformation to convert the CIEXYZ-values into CIEL*a*b*-values


The way to go should be to define a "new" distance function for RGB-values by
d(RGB_1, RGB_2) := CIEDE2000 (T(RGB_1), T(RGB_2)),
where T denotes the transformation as described above.

Quite something to do! Thanks again for the pointers!
2016-10-10 05:33
Ghostrider
Administrator

Posts: 43
That was fast, finding that sRGB -> CIELAB formula. Thanks for the link!
Yeah, that seems like the right steps to take. And something I think we haven't seen in the C64 scene yet.

A KickAss-script implementation _would_ be really really cool! (I wonder how fast it would be).
2016-10-10 06:33
Oswald

Registered: Apr 2002
Posts: 5017
I dont understand half of that german wiki. so rgb to xyz then xyz to lab ? what if I got heiligkeit grun blaue etc, how do I calculate a distance if i have 2 sets of values of those for 2 colors ?

Die Faktoren 500 bzw. 200 sollen die resultierenden Werte für a* und b* in die gewohnten Größenordnungen bringen, die auch zum maximalen L* von 100 passen.


wat ? :)
2016-10-10 09:14
chatGPZ

Registered: Dec 2001
Posts: 11100
what exactly are you trying to do with this anyway? from when i experimented with this stuff, i remember that YUV would always give the better result... the LAB stuff didnt help for what i was doing :)
2016-10-10 09:38
enthusi

Registered: May 2004
Posts: 674
I would agree that RGB distance is bad, and YUV already as good as it gets but I stand to be corrected.
2016-10-10 09:42
chatGPZ

Registered: Dec 2001
Posts: 11100
the one good thing with YUV is that you can handle luma and chroma seperately..... overall, for single pixels, chroma isnt really that important, luma is much more - so it fits perfectly the purpose.
2016-10-10 14:05
enthusi

Registered: May 2004
Posts: 674
*instant light green faces*
;-)
2016-10-10 15:04
chatGPZ

Registered: Dec 2001
Posts: 11100
from my experience thats much more of a problem when comparing colors in RGB space :)
2016-10-10 19:31
Copyfault

Registered: Dec 2001
Posts: 466
Quoting Oswald
I dont understand half of that german wiki. so rgb to xyz then xyz to lab ? [...]

Die Faktoren 500 bzw. 200 sollen die resultierenden Werte für a* und b* in die gewohnten Größenordnungen bringen, die auch zum maximalen L* von 100 passen.
wat ? :)

These numbers (500, 200) are certain scaling factors to ensure consistency between the values for L*, a* and b*.

As I don't have any experiences with L*a*b*-coordinates as of yet, I can just take those scaling factors as given and assume that they ensure proper calculation results.

Sorry for only posting a German link; unfortunatly, the english wiki did not contain information on how to convert from (some) RGB space to this L*a*b*-thing. At least I did not find anything like that up to now...
Previous - 1 | 2 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
MaD ][/Starship
csabanw
Sentinel/Excess/TREX
Sande/Hokuto Force
Guests online: 116
Top Demos
1 Next Level  (9.8)
2 Mojo  (9.7)
3 Coma Light 13  (9.7)
4 Edge of Disgrace  (9.6)
5 Comaland 100%  (9.6)
6 No Bounds  (9.6)
7 Uncensored  (9.6)
8 Wonderland XIV  (9.6)
9 The Ghost  (9.6)
10 Bromance  (9.6)
Top onefile Demos
1 It's More Fun to Com..  (9.8)
2 Party Elk 2  (9.7)
3 Cubic Dream  (9.6)
4 Copper Booze  (9.5)
5 Rainbow Connection  (9.5)
6 Wafer Demo  (9.5)
7 TRSAC, Gabber & Pebe..  (9.5)
8 Onscreen 5k  (9.5)
9 Dawnfall V1.1  (9.5)
10 Quadrants  (9.5)
Top Groups
1 Oxyron  (9.3)
2 Nostalgia  (9.3)
3 Booze Design  (9.3)
4 Censor Design  (9.3)
5 Crest  (9.3)
Top Coders
1 Axis  (9.8)
2 Graham  (9.8)
3 Lft  (9.8)
4 Crossbow  (9.8)
5 HCL  (9.8)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.06 sec.