Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Oh the colors are even more lies than you are letting on here.

Every object reflects different frequencies of light to different degrees, as I imagine you know. If you think of the range of frequencies in the visible light spectrum, you can construct for any object the “spectral power distribution” (SPD) that says how much light is reflected for a given frequency. So far so good.

But we don’t see “frequencies” of light. An object that reflects only yellow and an object that reflects red and green but no yellow will look the same to us, despite the fact that they are reflecting completely different light, thanks to the way humans perceive light. In fact, there is an infinite variety of different SPDs that to humans look like exactly the same color — called metamers — for any given color we perceive.

A color is an equivalence class, not a point on a spectrum.



Ooooh DAMN. Interesting idea. That part that pisses me off is that I was very familiar with all the concepts that you used, but I doubt I ever came close to the conclusion.

Ok, I concur, I was probably not aware that color mixing is a human physiology thing and not a physics thing.

So to clarify, when we mix red and green playdough as kids, what happens is all the little particulates/molecules interweave together, but each is reflecting a different signal. And when that variation/entropy back-and-forth between red and green is too high, the brain just melds them to yellow?


> And when that variation/entropy back-and-forth between red and green is too high, the brain just melds them to yellow?

Not “melds them”: it is yellow. A specific yellow, to a human, is any of the SPDs that triggers the same amount of “red” and “green” cone activity. It’s not some kind of brain interpretation trick, it’s literally the same signals reported by your eyes.


If my interpretation is correct:

human_eyes.input(emit_light(580))

-> ((0.5, 0.5, 0), "Pure Yellow")

human_eyes.input(emit_light([[650, 0.3456], [550, 0.4567], [450, 0.0]]))

-> ((0.5, 0.5, 0), "Pure Yellow")

human_eyes.input(emit_light([[670, 0.00625], [640, 0.03125], ... [450, 0.0]]))

-> ((0.5, 0.5, 0), "Pure Yellow")

... because input is a list but output is a weighted average in a single 3D vector.


Adding to this (I'm sure you are aware), that it is a bit more complex in reality. The SPD of a non emitting medium depends on the reflectivity (as function of wavelength) of the medium and the SPD of the illuminating light source. So two materials with different reflectivities would be metamers (appear the same color) with one light source but not for a second, while if they had the same reflectivity they would appear the same color for every light source.


Absolutely! Thanks for pointing this out — it’s in fact one issue with light sources that are not full-spectrum, like fluorescents and (even “white”) LEDs. They can make objects appear to be different colors!


And in addition, the classes are of different sizes. There is a such thing as yellow light, and red and green looks like it. There is no such thing as magenta light -- light is a linear spectrum, not a circle -- and yet red and purple together look like this nonexistent color. We see a continuity where there's a hard break.


Experienced a feeling of awe, thinking through the ramifications of this. Thanks for sharing zamfi!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: