How to average color
Vložit
- čas přidán 9. 05. 2024
- Talking about the pitfalls of averaging colors and how gamma and color space affects it.
Discord Link: / discord
BisectHosting was gracious enough to provide us with the Minecraft server we use for the community. If you are in the market for a server then you can use my code gneiss to get 25% off the first month when using any of their gaming servers.
bisecthosting.com/gneiss - Hry
Small correction:
I wrote and said square root and square in the wrong order when I was showing the conversion of the colors on the board. The values were correct, just wrote it wrong.
Also 13/3 is 4.333, not 6.5.... i changed the divisor and didn't update the answer. just horrible.
I added a little correction video to the appropriate place in the video.
So it's "Computer Color is Broken" all over again
I found that video while I was editing the first version of this and the candle explanation was so good I decided to replicate it and re-record the episode. The Minecraft gamma that I put back at the end was going to go there originally.
haha this reminds me of the captain disillusion video
Human eyes are broken and computers don't pander to us
or “human vision is broken”
@@raeplaysval indeed it is. Green is the brightest and pink doesn't exist.
To be honest, I wasn't expecting the geologist Minecraft CZcamsr to solve one of my biggest problems with doing pixel art out of nowhere, but I'll be danged. I've always had trouble figuring out how to do gradients in my pixel art, especially with the low color palette, and now I've got a pretty quick shorthand for calculating good average colors/have a strong idea where to color pick if I don't want to math it out. So uh... genuinely, thanks a bunch!
If you are rotating pixel art there is better way of doing this then averaging the colors. See Rotation by Shearing
For palettes if I need a middle color I make a pixel of color A and then put color B over it at 50% opacity to get color C. I don't know how the result maths out but I can do it without having to math it out or anything.
I can also fine tune the color manually afterwards. I'm curious if this method is accurate or not but don't want to do the math for it-
I am convinced Gneiss could make me watch paint dry.
Challenge accepted.
@@gneissname He's gonna make a whole video about how drying paint changes slightly in color and the mechanics of paint drying with simulations in Minecraft (idk what i'm talking about)
@@joaocomtil_lol
I'll watch, dead serious.
@@gneissname Oh goody, now I have something to look forward to! You've already accepted the challenge! No takesy backsies!
"Let's look at this *normal* Minecraft painting" 0:14
Very and completely normal, 100% vanilla
Looks gneiss to me
Between you and Acerolla, I’m really glad we’re getting quality content on youtube about OKLAB
Someone commented about Acerolla on another video and I wasn’t familiar, watched some stuff since and now subbed. I didn’t know they talked about Oklab.
Yeah, his video “Your colours suck (it’s not your fault)” is the video about it.
It more or less introduced and explained to me most of the general terms related to digital colour. Really appreciated that video.
@@gneissname like @reporpoised said above 👆, his “your color suck” video is pretty well made about it, he’s got a quick and punchy editing style with a lot of zoomer memes.
i’m glad it’s gotten more attention, it’s been a favorite of mine for years
i really hate when the messy interpolation averaging happens in pixel art stuff, it looks blurrier because it's not taking the most prevalent color and displaying that, it's just mixing them together and assuming that'll look right
There's a great video by matt parker about how skews can rotate images without messing up the overall image
@@oblivion_2852 oh i use aseprite, it's got a good system for scaling and rotating, might check that vid out though!
your feelings are irrational
actually, they're completely rational. the world is not as good as it could be and they wish it was better. thats pretty in accordance to reason or logic.
for pixel art just use Nearest Neighbor to resize. averaging colors together works well for large images
Common misconception about sRGB gamma, the gamma curve of the sRGB color space actually comes from the response curve of a CRT display, not the human eye, the two just happen to be similar to each other
That's not just happenstance, the three phosphors in CRTs were selected (from a much bigger pool of possibilities) BECAUSE they match closely with human cone cells.
CRT superiority is proven yet again.
@@penguino118 I mean, that extends to modern display tech as well.
One misconception about gamma correction I'd like to address-cameras don't do gamma correction simply because applying a curve to the colors makes them look more accurate to our eyes. We do it because the monitor is applying the opposite curve to the colors being fed into it (approximately but not exactly an x^2.2 curve). The two curves cancel out. The camera stores the colors in a nonlinear space, and the monitor takes those values which are in a nonlinear space and makes them linear again.
One benefit of this is that sRGB makes it so that the brightnesses corresponding to the RGB byte values appear to be spaced apart evenly to our eyes (they are distributed more evenly in perceptual brightness), which makes color banding less noticeable than if the relationship was perfectly linear. Another detail is that the sRGB curve was chosen because it closely matched the curve found in CRTs.
Exactly. And the reason it's called gamma *compression* is that using the nonlinear mapping allows using fewer bits to represent color. 8 bits per pixel is enough in sRGB, but you need at least double that in linear color to avoid noticeable banding.
That love how when you first learned about color for computers you think oh it's just RGB. Then you get Gama thrown at you and color space .etc
Man these are always great videos.
Cool. This is what you were talking about in that discord stream!
Yeah, this is the sidetrack I got on while making the texture noise and then got sidetracked from this one to make the paining one.
The way you visualise in Minecraft is so cool. I don't know how much of it is actually in engine or how much is editing magic, but either way you create a very immersive learning experience
I always love these videos! In undergrad I worked on a project with a species of fish that would change color based on its behavior and social rank. I used an LAB color space to quantify the changes in their color through time!
It's a minor tangent to your intro, but maybe a young artist who catches this would be curious: needing to average color values of pixels when transforming an image only happens when the image is a raster or a bitmap. The same need doesn't exist for vector images.
vector images are still rastered into pixels, and when you have edge cases like half a pixel being filled, or working with super sampling / anti aliasing, you may need to worry about color spaces
@@incription Vector images and raster images are two different things though. Wouldn't that only come into play if you make the decision to rasterize the image?
(I just learned this in a textbook lol, I don't know anything)
@@Gandhi_Physique you need to rasterize it if you want to display it on a screen that has pixels
you have to rasterize a vector image when you render it to the screen@@Gandhi_Physique
@@official-obamabut that's something that only needs to be happening at the very end of the pipeline, after applying rotation and scaling. Rasterizing a vector image before rotating or scaling it would be a very dumb idea, for many reasons.
1:55 I feel like this applies to alot of things in life, for example if your running away from one lion or two lions is much more important than 102 or 103 lions, same as if you lost 1kg or 2kg of weight is much more important than 52 kilos or 53 kilos.
The real truths
the lions example is true, the weight example is not
what matters with non-linear scales is the absolute reference frame, not the relative reference frame
the significance of a loss or a gain of 52kg vs 2kg depends on how much you already weigh
e.g. if you are 50kg, a 52kg loss would mean you... have negative mass?
with the lion example, if our measurements began at -100 lions, then the difference between adding 102 vs 103 lions would be quite significant and the difference between adding 1 or 2 lions would not.
You count lions starting at 0 lions whereas you didn't specify where the loss/gain began in the weight example.
Exception when there's threshold values. E.g. you may be able to barely lift 40kg, but 41kg is too much and you injure your muscles instead.
these videos are always so intresting, i love how u can be talking about a topic that has nothing to do with minecraft but still have it perfectly fit with the game
Love this deep dive. I'm always game for more color space talk. Thanks for sharing.
You put a lot of effort into your content. You also have a lot of passion.
I think that's awesome!
Your videos are so interesting, I really enjoy your style of content!
These videos about color are so fire I can't get enough of them.
super super interesting stuff. this might sound like an insult at first, but the video felt really long. not because it was boring, but because you crammed so much information in the first three minutes i thought the video was gonna end. there aren't many videos that i find have so much helpful info. keep it up!
i love your freaking good videos about gamma/color
Such a banger video. Keep up the good work
I just love, how everything in your videos make perfect sense, and you seem like a very educated person, and then spontaneously 13/3 is 6.5... that makes me laugh so god damn hard
I really hate the term "gamma correction". There is nothing correct about it and the term itself doesn't tell you weather or not it means applying or removing the gamma curve. IMO we should just say linear or gamma space, which is much clearer.
The term "gamma encoding" is what I use, since the point of gamma is to store and transmit color. It helps me remember that my program needs to decode color values into linear space on the way in, and re-encode them into gamma space on the way out (then the monitor will decode them again when it displays them).
I had an idea that might make for a good geology video.
Given that the overworld is explicitly not made of granite, andesite, diorite, basalt, tuff, or calcite, and that deepslate is some kind of slate or other sedimentary rock under high pressure, and the evidence of stone being some kind of carbonate rock due to the abundance of caves, and volcanic activity only at the deepest points of those caves, I think a plausible explanation for the overworld's strange geology is that the entire world as we know it is made up of what used to be layers of coral-like organisms, hundreds of meters thick, and that the deepslate layer was once the ancient seafloor of a water world.
As a programmer and a color science & art nerd, your vids are so nice to see and learn from
Bro, your teaching style × high quality Minecraft visual examples is. Like. Incredible for my soft litl brain.
Man, I love this channel
+sub
1:59 reminds me I should listen to Bill Evans again, Thanks! Also, when showing the better average at 2:43, the arch on the graph reminds me of Lambert's Emission Law, even though that has more to do with value rather than color for art related purposes.
World record for fastest intro ever. Ngl it sounded like I joined part way in the video, then I realized you said "Gneiss here" but fast lol.
These are so fascinating
I'm excited that we're going down this rabbit hole
I love your videos on colors
yay new colour video
OMG I LOVE THIS STUFF SM
Very neat demonstrations, and here I thought you just did geology stuff
If this man did math animations or video essays about the math or code it would just become my main resource on learning about computer color
The amount of knowledge in this minecraft video.... waiting on that geo one💪
Holy fuck I need this thank you so much. Thank you for your beautiful brain.
Huh neat. I'll take this into account when working with shaders
Damn those MC visualisation looking sick
"Let's look at this normal Minecraft painting" yeah this painting is so gneiss
At this rate you're going to do a video on premultiplied alpha.
if i remember correctly, captain disillusion did a pretty good video on that
I think some gneissname Minecraft calculus explanations would be very interesting to watch. Could be good for trying to learn those concepts too, especially for multivariable calculus with 3 Dimensional concepts! Just a suggestion
The best kind of correct, indeed.
I LIKE THE “no” IN THE TITLE THO IT MAKES ME BRAIN HAPPY
I love this guy
This man is a genius with display entities.
It's been fun seeing the arc from geologist to colorist
Been messing with Doom's color palette for a while now. It taught me a lot...
you could say that the playback slider of this youtube video is a uniform space, except not relative to color, but to instanity, because linarly to how far I get into the video it perceptually starts feeling more like a fever dream
Your videos about color are great! Any chance you could do one about how colorblind eas changes the perception?
as a web developer that still doesn’t quite get the CSS color v4 spec, i seriously appreciate these videos
“No matter what, there is always averaging”
*Skew rotating joined the chat*
I never thought i could learn so much from minecraft
Ohhhh this is definitely a big pet peeve. I think I've seen Captain Disillusion do a video on something very similar to this very topic, iirc "the horrors of the alpha chanel"? If you haven't seen it, I would highly recommend. I think you'd like it and a few of his other videos tbh
=D he's back with more
Color, math and Minecraft. 3 of my favorites :)
🖥️💻"Beep boop beep we cant avarage🤖🤖🤖🤖🤖"
This was so helpful even tho I only gonna use it for Photoshop
reminds me of ‘computer color is broken’ from minutephysics
It's been one of the things that has been a pet peeve for me since basically forever.
So far that I tend to retouch after averaging just to fix the issue.
And yes, our perception is indeed logarithmic. It is important to know if there is 1 lion or if there are 3. But the difference between 10 lions and 13 lions isn't important, it's still a lot of lions coming after you.
And the most sensitive area of the human eye is in the green area. Not only is there an overlap of different cone cells, but rods also have their peak there.
Oh and many games have separate brightness and gamma sliders. And they do what their name suggests.
2:58 OMG, this really looks like a mix of the two colors better than the color on the left side!
cool video, i love colors
When you started talking about using the averages of numbers, what I thought was that it would maybe be better to use a logarithmic scale for the average.
Like the example you gave with the candles, my guess is that we would perceive proportional increases.
Adding adding 4 candles to already existing 4 candles would have about the same effect as adding 1 candle to an existing candle.
I feel like Ive beem dueped into learning
Thought this was gonna be advice on how to avg color.
"But no matter what, there is always averaging"
Worth noting that there are ways to get non 90° rotations without any averaging or color changing at all (like doing 3 shears), but outside of authentic low-resolution pixel art, it's fairly limited in actual use
for colour spaces, it also depends on what kind of thing you're trying to show as to what colour space is best. for example, to simulate what colour you'll get when you mix 2 different lights together (or really anything to do with lighting or transparency) you'll wanna do this in linear RGB space rather than sRGB or OkLab
you lost me but the visuals go crazy
this is useful
“Geology of Vintage story” when?
what's the font you are using seen in the video?
Some form of Bahnschrift
You mentioned averaging colors to scale and rotate an image. If you want yet another extremely deep topic filled with subtle misinformation, you can look into filtering, sampling, and antialiasing, which is the math concerning how, exactly, you combine those pixels.
Here's some base-level knowledge:
- The Sampling Theorem says that for any signal, you can perfectly reconstruct it from a series of samples, as long as the sample rate is greater than twice the highest frequency in the original signal.
- For audio, that means using an analog low-pass filter during recording tuned to half the sample rate, and then reconstructing the signal with something like a Sinc filter. Since humans can only hear up to around 20 kHz, you only really need to sample at around 40 kHz (although most audio is sampled slightly higher because low-pass fillters aren't 100% perfect).
- For images, it's a bit harder since there is a potentially unlimited frequency (a checkerboard from far away, a hard edge, or a very small object are all examples of high-frequency features). Applying a low-pass filter to an image essentially means blurring. Many cameras actually have an optical low-pass filter, which is just a slightly blurry piece in front of the sensor. For video games, it's a lot harder, since there isn't a real-world analog input to start with. You have to sample at as high a frequency as you can, which means rendering more samples than there are pixels on the screen. Obviously that gets slow quickly, so there are various techniques that try to approximate the result or gather the samples over multiple frames. Sampling is also needed when performing operations on images, such as scaling or rotation. In this case it's typically called resampling.
- Image sampling is a bit messier than audio sampling, because if you use a pure-frequency approach such as Sinc, you end up with distracting ringing artifacts. On the other hand, a filter that is too soft will make the image appear too blurry. Typically the Mitchell and Lanczos filters are considered pretty good if you can spare the processing power in your use case, however they are still not perfect, and it depends on use case.
- Just averaging the 4 pixels that land in a square is called box filtering, and is one of the lowest-quality filters. It still leads to lots of aliasing in many cases. However, many programs use it because it's simple and it runs fast, leading to many people believing that there's no reason to use anything else. It's what's used in most real-time applications such as vector graphics rendering, web browsers, video games, etc.
I would recommend the following articles if you want to know more:
- Xiph's article "24/192 music downloads and why they make no sense" - Has some introductory information about audio sampling.
- Alvy Ray Smith's Microsoft memo "A Pixel Is Not a Little Square" - A very good (although from 1995) article about many of the misconceptions about sampling and filtering.
- The ImageMagick docs page on resampling filters - Provides an overview and comparison of some different resampling filters, as well as a conclusiong on good default choices at the end.
The charts are completely confusing. But this has been figured out. Nuke, the software used for compositing in film. Converts everything to linear color space. So the average is just the average. Then you convert the whole finished thing back to whatever colorspace.
The new sethbling
can you make a video of the blocks in grayscale?
I think the music in combination with the moving video and talking is a bit much when you're explaining things gneiss! 🤔
Just wait until you discover the joys of a "Scene-referred" color space. Or, in other words, a colorspace with no limit to how bright a color can get. It's the "color space" real life is in, and it's useful in 3D rendering for calculating lighting since there's such a wide range of brightnesses you can have. I've adopted it for my 2D art and it makes it remarkably easy, combined with a linear gamma and a tonemapper, to make great looking lighting with minimal effort.
7:15 i understood all the arguments in the video but ngl to me the blending without gamma still looks better to me
This is probably a case of being used to seeing incorrectly blended colours everywhere, since it is the default or even the only option in a huge amount of software
I just put down a color and then put the second color over it at half opacity, then color pick the result. That gets what I assume is an average between the colors. It's always lighter than the darker color and darker than the lighter color.
Oh man, I went down this very same rabbit hole recently when investigating why they changed the official color scheme of Neptune, because when I look at Neptune through a physical telescope, I don't see the image that's now being pushed (though I also don't see the dark blue, either, it's more something in between). The new image of Neptune came from a reprocessing of the image's gamma correction, which could be what our eyes see from up close, but from far away where less of its reflected light reaches us & it gets diffused by the atmosphere, it blends more into the darkness of the sky. It does look at least noticeably different from Uranus when looking at both of them from the ground.
I was curious how Geometric Mean (multiply then take the square root instead of add then half) would apply to colors so I randomized two and calculated the geometric:
Color 1: #1a7775
Color 2: #21500a
Geo Mean: #1D6222
The Geometric mean will never be brighter than the Arithmetic mean. sqrt(xy)
0:01 looks like Minecraft terracotta
Because that’s what it is
Gamma is just a compression method, so that dark colors (where you demonstrated the difference matters more) cover more of the 256 possible values. The monitor undoes the gamma function, so it's still outputting linear values (apparently this was just a useful side effect of CRT monitors, and is why gamma exists in the first place). It is objectively incorrect to do any operation to colors before they have been decoded from gamma space, and yet that's exactly what most software does.
Example of intended usage of gamma: I'm working on a Minecraft shaderpack. The textures are stored in PNG, which uses sRGB space and is thus gamma encoded. The first thing my code does when it reads a texture value is raise it to the power of 2.2, bringing it back into linear space. No information is lost here, since my shader is working with 16 bit floats. Once all of the calculations are done, such as lighting and post-processing, the very last step in the shader is to encode the result into gamma space by raising it to the power of 1/2.2. When the monitor receives the value, it converts it back into linear space and displays it (from what I know, most software and monitors just use a power of 2.2, rather than the piecewise linear / 2.4 curve specified in the standard).
3:27 The average gamma of sRGB is actually 2.2 instead of 2.4. Although there is 2.4 in its formulae, it averages down to 2.2.
If you are shrinking pixel art do you really want to be averaging or is there a better way, like some kind of median filter? that way it will be picking one of the colours present in the original image rather than mixing them
This guy is the solution to when the top result is reddit but the only guy who replies is refusing to acknowledge the question
W bill Evan’s reference
I wonder though. Is there literally any way to convert video into a sort of sRGB space so that it gets accurately shown on web browsers and web apps?
The same problem happens when you want to create a color gradient. If you simply interpolate linearly between the two colors, then the middle is often kind of greyed and washed out. That's because, if you take any two points in a cube, the average of the two points is often closer to gray than the two points. However, if you interpolate over HSV or HSL instead, you get a much more pleasing result that keeps its luminance and saturation ! The problem is that if the hues are very far away, or on different ends of the spectrum, you might have a gradient that goes red to yellow then green then blue then pink, instead of the red to pink gradient you wanted. It can be solved with a bit of cycle logic, but not from, say, 0° to 180°.
I think there's some merit to a nuanced approach between the two, where you interpolate both in RGB space and in HSV space, then convert both colors to RGB and do a weighted average, with the weight being a chosen parameter. 0 gives you full HSV, 1 gives you full RGB, and between the two is a gradient of gradients.
It might be because I'm tired but I have no idea what this video is about. I understood the color averaging thing due to srgb no problem, but I have literally zero idea what the 3D graphs were supposed to show and what was plotted on them.
Mathematically, It shouldn't matter at all in which linear color space you calculate the average. That's the whole point of linearity. The results should be the same.
Let's take two linear color spaces, let's call them (A B C) and (X Y Z) for example. A,B,C,X,Y, and Z are vectors representing the primary colors of these spaces.
Now let's take and arbitrary color D. It has cooordinates (a, b, c) in colorspace (A B C), and (x, y, z) in (X Y Z)
D = a*A+b*B+c*C = x*X+y*Y+z*Z
|a| |x|
D = (A B C). |b | = (X Y Z). |y |
|c| |z|
Now, E = d*A+e*B+f*C = u*X+v*Y+w*Z (coordinates (d,e,f) in (A B C), and (u, v, w) in (X Y Z)
Then, if we take (D+E)/2, we get (a*A+b*B+c*C + d*A+e*B+f*C)/2 = A*(a+d)/2 + B*(b+e)/2 + C*(c+f)/2
|a| |d| |a| |d| |(a+d)/2|
(D+E)/2 = 1/2 *( (A B C) .|b| + (A B C).|e| ) =1/2* (A B C). ( |b| + |e|) = (A B C) . |(b+e)/2|
|c| |f | |c| |f | |(c+g)/2|
so the average has coordinates ((a+d)/2, (b+e)/2, (c+f)/2) in colorspace (A B C)
Using the same resoning, it also has coordinates ((x+u)/2, (y+v)/2, (z+w)/2) in colorspace (X Y Z)
And assuming matrices (A B C) and (X Y Z) are inversible, you can convert the coordinates of the average from on space to the other and see that you end up with the same result as if you calculated in the other colorspace to begin with.
|(a+d)/2| |a| |d| |a| |d| |x | |u| |(x+u)/2|
(X Y Z)^-1 . (A B C) . |(b+e)/2| =1/2 * (X Y Z)^-1.( (A B C) .|b| + (A B C).|e| ) =1/2( ( (X Y Z)^-1.(A B C). |b| ) + ( (X Y Z)^-1.(A B C). |e|)) = 1/2(|y | + |v|) = |(y+v)/2|
|(c+g)/2| |c| |f | |c| |f | |z | |w| |(z+w)/2|
In both spaces, you can just average the coordinates to get the "true" average color.
Which makes me wonder why the OKlab average is different than the linear sRGB average. Maybe OKlab isn't linear enough?
Ok I checked OKlab's specs, it is NOT a linear color space.
So no wonder the averages are different.
(Also sRGB eotf approximates to gamma 2.2, not 2.4, this could also affect the results, but probably not as much as oklab's non-linarity)
Probably a weird question but what is the best way to create a gradient between two colors that look "visually" good using programming.
me: literally takes the average of the two values
You said that photoshop by default uses the darker colors, is there a way to make photoshop use a different method?
have you made your own minecraft world/server/mod?
goat