Show HN: Simple algorithm and color space to generate diverse skin tones
Posted by automatoney 2 days ago
Hello HN!
I found that picking out plausible but diverse skin tones for my digital art and game development projects was kind of difficult, and I got curious about if there was a way to define a color space that made it easy.
I've built a color picker and procedural generation algorithm based on the space as well as a bunch of other fun js features and demos throughout the page that use the equations. If you find it interesting, I have lots of explanations of how I built it and what properties the space has.
The methodology might be a bit shaky, but hopefully the result is as helpful for others as I have found it! There's lots of room for improvements (see the Future Work section), but I'm really happy with how it turned out.
Comments
Comment by vermarish 2 days ago
Then, I thought this would stop at using the U-space vectors (the ones that form the basis of the PCA image) and their corresponding ellipse to form our color space, but no, the function fitting is a very slick idea, even if it was executed by hand.
Lastly, I love the presentation of sampling from different r values. Whether you sample from a fixed r value or a range of r values, I bet this has great applications in game design or animation.
I still don't quite get the manual data labeling process at the beginning? It seems like it would encode some bias, but the consistency of the first point cloud and the results certainly speak for themselves.
Comment by dr_scully 2 days ago
Comment by dTal 2 days ago
Once upon a time, I encountered a sort of interactive museum book called "Earthsearch". One of its "exhibits" was a color wheel, made of two spinnable pieces of tinted acetate, that purported to be able to generate any skin tone. I suppose this is three degrees of freedom, since for any position of the two wheels you could access a range of colors around the edge - but the printed page underneath was simply a grayscale gradient, so one degree of freedom was simply luminance.
The book was released in 1994, and was very confident. It even went as far as to encourage the reader to see a doctor, should their skin tone not be achievable! What color model were they using?
Comment by dr_scully 2 days ago
But I can’t vouch for the accuracy of the book, but I suspect it was an approximation.
The haemoglobin and melanin are roughly in separate layers of the skin. There is an approximation known as Beer-Lambert that models the skin as two semi-transparent layers. This ignores subsurface scattering, but is roughly correct.
So, in theory two acetate sheets might replicate this. That’s my intuitive opinion. It has been many years since I did this work.
Comment by mhink 2 days ago
Comment by ReactiveJelly 2 days ago
Comment by dTal 2 days ago
Comment by vector_spaces 2 days ago
Comment by GolDDranks 2 days ago
Comment by dr_scully 2 days ago
There is a separate effect of increased bilirubin content, that would appear if someone was ill.
Comment by HanClinto 2 days ago
It's fascinating to learn that melanin and haemoglobin are the two primary factors (and cover the vast majority of cases), but I'm curious how many other illnesses / disorders can produce compounds with visible effects.
Thank you for your posts on this thread -- I appreciate you knowledge-sharing on this!
Comment by dr_scully 2 days ago
Comment by Joel_Mckay 2 days ago
People only turn yellow if they have kidney or liver damage. However, some distinctive features like Lucy Liu's natural freckles are tough to draw right.
We looked around a lot for a procedural texture/shader to help make the project characters look less sickly, and please also consider supporting the persons work if you are able:
https://kuhantilope.gumroad.com/l/ultimate-skin
Best of luck =3
Comment by CITIZENDOT 2 days ago
Comment by Joel_Mckay 2 days ago
The "The Ultimate Blender 3D Sculpting Course" covers several sculpting techniques, and while this course has a number of challenges it does cover several basics. Probably wise to wait for a sale event if interested.
https://www.udemy.com/course/blender-3d-sculpting-course/
Best of luck =3
Comment by iwontberude 2 days ago
This is not true. Roughly 5% of people have Gilbert's Syndrome which is genetic, metabolic abnormality where the bilirubin from dead blood cells are conjugated slower than the baseline patient leading to yellowing of the skin. It is not due to liver damage or disease and is a benign condition. Not to mention there is carotenemia from eating too many carrots or squash -- again not kidney/liver damage related.
Comment by itishappy 2 days ago
https://my.clevelandclinic.org/health/diseases/17661-gilbert...
Comment by iwontberude 12 hours ago
Comment by Joel_Mckay 2 days ago
Comment by skydhash 2 days ago
Comment by numpad0 1 day ago
Comment by mdnahas 1 day ago
Comment by automatoney 2 days ago
Comment by s1mon 2 days ago
It seems like some work was done to research existing approaches, but I don't see any reference to Pantone Skin Tones [0]. Without intending to, I've worked on 3 different projects which involved measuring skin tones for makeup applications. The Pantone range is not 100% perfect, but it's pretty well done and easy to understand. There are two axes: a light/dark one, and red-yellow one [1].
[0] https://www.pantone.com/na/en-us/skintone
[1] https://cosmeticsbusiness.com/pantone-skintone-guide-80945
Comment by ptmkenny 2 days ago
Comment by zild3d 2 days ago
Comment by itishappy 2 days ago
Comment by tialaramex 1 day ago
The person inviting you to a picnic "next week" might need to know about Time Zones if they live some distance away. The requirement to update the CSS on the web site to match a new company logo might need to know about Colour Spaces. But that picnic invite doesn't care about Calendar systems or Leap Seconds, and the logo mandate doesn't care about Sub-surface scattering or a Quantum theory of light.
Comment by mbo 2 days ago
I was looking at this a little while ago, and used some of The Pudding's data on makeup/foundation shades (https://pudding.cool/2018/06/makeup-shades/) and plotted it into the Oklab colorspace (https://observablehq.com/@55th/foundation-shades). The shades form themselves into that same crescent as seen in the article.
Comment by automatoney 2 days ago
Comment by dahart 2 days ago
Pete Shirley (author of Ray Tracing In One Weekend) is also a part time color scientist, and he clued me into the fact that if you crank the saturation to 100% of pictures of people of any race, the skin color comes out orange. I think I heard that some face detectors may work on this principle, but I don’t remember where I heard that.
Comment by mryingster 2 days ago
Comment by madcaptenor 2 days ago
Comment by dahart 2 days ago
So it might not be that surprising that dark skin people turn orange when sat is cranked, but perhaps slightly surprising that light skin people do.
Anyway, I suspect it’s computationally easier to turn everyone orange than brown. Plus, given that brown skin is already a category, orange could be useful terminology/category.
Comment by adamhartenz 2 days ago
Comment by jagged-chisel 2 days ago
Comment by a3w 1 day ago
Comment by dahart 1 day ago
I meant race. We’re only talking about skin color here.
“Today, race refers to a group sharing some outward physical characteristics and some commonalities of culture and history. Ethnicity refers to markers acquired from the group with which one shares cultural, traditional, and familial bonds.”
https://www.merriam-webster.com/grammar/difference-between-r...
Race does exist (as does racism, unfortunately), and Wikipedia does have a page on race, as does any dictionary you choose. It would be a fair point that people should be sensitive to which word they choose based on context, and race is sometimes not the right word, but in this case it is the better choice, and the distinction in this context between race and ethnicity isn’t super relevant.
Comment by JuniperMesos 1 day ago
Comment by jhgb 1 day ago
Comment by binaryturtle 1 day ago
Also it would be one human "species", not "race".
Comment by mathgeek 1 day ago
That’s also subjective. It’s taxonomically a subspecies. I find it best to keep that discussion simple rather than argue the pseudoscience argument.
Comment by andai 2 days ago
"Only realistic colors" would be a different problem. And I'm not sure if there's a way to solve that problem without excluding some real colors too.
(Maybe if the colour selector was a different shape? I don't know much about color spaces.)
Comment by automatoney 2 days ago
"not sure if there's a way to solve that problem without excluding some real colors too" - 100% right on that too. A big part of this work was to define a way to tweak/improve the equations in order to approach a solution to these issues - part of my hope in sharing is to get more eyes and brains thinking about this and proposing improvements!
Comment by compass_copium 2 days ago
This is a really nice project. Great work and a great write-up. Thanks for sharing.
Comment by rsynnott 2 days ago
You'd be surprised: https://en.wikipedia.org/wiki/Argyria
Comment by richiebful1 2 days ago
Comment by wongarsu 2 days ago
Comment by stephantul 2 days ago
Comment by automatoney 2 days ago
Comment by E-Reverance 2 days ago
Comment by benj111 1 day ago
Comment by dofm 2 days ago
The 2.0 “outliers” cover those skin tones.
Masai and some Somali skin tones, similarly, look better represented by the outliers.
The full range of possible human skin tones is perhaps a bit of a challenge for technical colour representation, partly because diffuse reflectance seems to vary so much and that is hard to approximate on screen (e.g. as any website designer could attest, the difference between representing silver and grey is the use of highlights), though the representation of skin tones is a lot better than the early colour film era.
Comment by automatoney 2 days ago
The issue I ran into was what happens when the space moves beyond RGB, but I think the fix is to just add clamps to the end R, G, B values.
Comment by stu2b50 2 days ago
When you’re actually painting, skin can really be any color. Blue is a perfectly valid (and fairly common) skin color - just look at someone in the moonlight. It takes two to tango, and the other dancer is the light source.
Comment by m_w_ 2 days ago
Wish I had this on hand like this three or four years ago when I was working on VR avatar software - we had hard-coded skin tone options at the time - would have been a cool addition!
Comment by automatoney 2 days ago
But absolutely the hope is that this is a tool that stays accessible to people for whatever they're building and everyone can slow down on reinventing the wheel here for every character creator/digital art application.
Comment by Sharlin 2 days ago
Nb. I'd advise against calling the PCA'd space XYZ because that's a well known standard color space: https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_XYZ_c...
Comment by rebuilder 2 days ago
Comment by bellowsgulch 2 days ago
There is at least one article published by a technical artist at Pixar who describes modeling a skull within a human scan so that subsurface lighting is more accurately rendered.
I suspect you could combine this with dr_scully’s comment and GolDDranks’ to reach the nuance involved in long tail realism details.
Comment by automatoney 2 days ago
Comment by RIMR 2 days ago
Comment by automatoney 2 days ago
Comment by herf 1 day ago
The JS code seems to output linear RGB directly to the webpage (missing gamma). I guess the difficulty with "adding gamma" to it is this: if the training data were also gamma encoded, then it might need to be refit with linear values.
Comment by zestyping 2 days ago
From the way the article is written, it sounds like you presented yourself with a bunch of faces of completely random colours and then manually sorted them into two categories, "plausible skin colour" and "implausible skin colour".
But I feel like I must be misunderstanding, because I don't see why you would do that. Why wouldn't you gather photographs of actual faces and sample colours directly from the photos?
Comment by aaroninsf 2 days ago
but this is just lovely and inspirational work. A unique marriage of hacking in the celebratory sense, thoughtfulness, and meaningful contribution. Outstanding.
Comment by automatoney 2 days ago
Comment by hluska 2 days ago
Comment by manoDev 2 days ago
So even when you get the palette right, to paint it like a believable material in a convincing way is still super hard!
Comment by xp84 2 days ago
Would love to see this 3-D picker ability in the many character designers out there, instead of the lame 8 swatches or whatever.
Comment by barbecue_sauce 2 days ago
Comment by kaitlinseng 2 days ago
Comment by PullJosh 2 days ago
Comment by szvsw 2 days ago
https://canopycanopycanopy.com/contents/color-goes-electric
The Kodak “Shirley cards” and test shots are of course famous in the media theory world for how they baked notions of race and “standard” or “normal” conditions into the medium of photography. Not dissimilar from the various discussions around facial recognition from approximately 10 yr ago.
Comment by rrradical 2 days ago
Comment by automatoney 2 days ago
Comment by Joel_Mckay 2 days ago
https://kuhantilope.gumroad.com/l/ultimate-skin
https://extensions.blender.org/add-ons/mpfb/
https://github.com/alessandro-zomparelli/tissue
ymmv, as some paid plugins actually speed up the funky blender workflow (the auto-Bake plugin by the same author is important for procedural generated textures.)
https://sanctus.gumroad.com/l/SLibrary?layout=profile
Have a great day =3
Comment by 1-6 2 days ago
Comment by ecesena 2 days ago
Comment by ptsneves 2 days ago
Comment by analog31 2 days ago
https://econocrafts.com/products/crayola-colors-of-the-world...
Comment by kazinator 2 days ago
Comment by nullsanity 2 days ago
Comment by mkesper 2 days ago
Comment by peepsick 2 days ago
Comment by efitz 2 days ago
An albino that consumed too much colloidal silver for years?
Comment by zetanor 2 days ago
Comment by alexpriyad 7 hours ago
Comment by Abh1Works 2 days ago
Comment by ralusek 2 days ago
Comment by JacobAsmuth 2 days ago
Comment by uhdozo 2 days ago
Comment by BLACKCRAB 1 day ago
Comment by Roselol 2 days ago
Comment by fenestella 2 days ago
Comment by mediumdeviation 1 day ago
Comment by tyromaniac 2 days ago
Comment by jademcd 1 day ago
Comment by juleiie 2 days ago
Comment by noobahoi 2 days ago
Comment by nahidmahmud555 2 days ago
Comment by drnick1 2 days ago
Comment by moralestapia 2 days ago
Comment by Tossrock 2 days ago
Comment by 4848489449 2 days ago
Comment by richard_chase 2 days ago
Comment by dshoemaker 2 days ago
> It's your art, you can choose whatever skin tones you wish.
This is pretty self evident, no?
Comment by richard_chase 2 days ago
Comment by kentm 2 days ago
Comment by richard_chase 2 days ago
Comment by DonHopkins 2 days ago
Comment by richard_chase 2 days ago
Comment by richard_chase 2 days ago
Comment by xdennis 2 days ago
Comment by BHSPitMonkey 2 days ago
Comment by 383toast 2 days ago
Comment by LocalH 2 days ago
Comment by numpad0 1 day ago
Comment by BHSPitMonkey 2 days ago
Comment by hneqy2wqls 2 days ago