The curves tool is a sophisticated way to adjust the brightness and contrast of your image, as well as color correct your image. It is similar to the levels tool in the type of adjustments it makes to your image, as well as the fact that both tools use a histogram to display pixel values. However, the curves tool uses a curve to adjust your brightness and contrast and the three color channels of your image rather than using shadows, mid-tones, and highlights sliders. This provides more flexibility than the levels tool, but also increases the amount of complexity in the tool. So, the curves tool is not quite as beginner friendly.
With this tutorial, my hope is to make the highly useful curves tool more accessible for beginners. Let’s begin!
Introduction to the Curves Tool: The Layout
For starters, the tool can be accessed by going to Colors>Curves (red arrow in the image above).
At the top of the Curves dialogue you’ll see a dropdown titled “Presets” (red arrow in the photo above). I’ll get into this later.
Below the Presets section is another section titled “Channel” (blue arrow in the photo above). This allows you to select the channel you’d like to edit for your image; the options are Value, Red, Green, Blue, and Alpha. The Value channel represents the brightness of the image. When you make edits to this channel with the curves tool, you will either make your pixels brighter or darker.
The Red, Green, and Blue channels are all color channels. When you make edits to these channels using the curves tool, you are either adding saturation for that color (i.e. for the red channel, you are adding saturation to the reds in your image), or you are adding saturation to the opposite color on the color wheel (for the opposite of red, you add Cyan).
The Alpha channel represents your image’s transparency. If your image does not currently have an alpha channel, this option will be grayed out (as you can see in the image above). This concept is a bit more complicated, so I’ll save it for later in the tutorial.
The main area of the Curves tool below the Channel section is where you’ll be making your edits. Here, you’ll see a grid with a diagonal line going through the middle of it. This line is called a linear curve (red arrow in the image above). It is straight for now, but it will become a curve as we add nodes to it and change the position of those nodes.
Behind the grid and the linear curve is your image’s histogram (blue arrow). The histogram displays the values of the pixels in your image like a bar graph.
The far left of the histogram represents the darkest pixels (shadows – highlighted in blue in the image above), while the far right of the histogram represents the brightest pixels in your image (highlights – highlighted in green in the image above). The middle portion of the histogram is the mid-tones (highlighted in red in the image). The taller the bar for a single value in your histogram, the more instances there are of that shade or color pixel in your image.
In this case, the histogram is skewed to the left (highlighted by green in the above photo), which means our image is a bit on the darker side. Additionally, there is a cluster of pixel values towards the left side of the graph that have tall bars (red arrow). This tells me there are a decent amount of pixels that have this particular shade, which is a darker shade.
If I had an image with a lot of bright pixels (i.e. a blown-out sky), the histogram would be skewed to the right and would have several tall bars representing high instances of bright pixel values on that right side of the histogram.
You’ll also notice that there are two gradients – one horizontal gradient along with bottom of the graph and one vertical gradient on the far-left side of the graph.
The gradient along the bottom of the graph is called the Input range (red arrow in the above photo). The gradient goes from black on the left side (green arrow) to white on the right side (blue arrow). As I touched on earlier, this represents the current pixel values of your image – with the darkest values on the left side of the histogram and the brightest pixels on the right side of the histogram. So, in other words, the bar values I talked about correspond to the gradient at the bottom of the graph. The higher the bar at that particular point in the Input range, the more instances there are of pixels in your image with that exact value.
If you have a really tall bar at the far-left end of the histogram, that means you have a lot of black in your image. If you have a really tall bar at the far-right of the image, it means you have a lot of white in your image. If you have a really tall bar in the middle of the histogram, it means you have a lot of mid-tones. (these statements are more true when you have clusters of “tall bars” in an area of your image – not just a single tall bar)
On the other hand, the gradient on the left-hand side of the grid is called the Output range (red arrow in the image above). This represents the new values you want to set your pixels to. The gradient is black on the bottom (blue arrow), and white on the top (green arrow). All this means is that dragging your curve upward will brighten existing pixels, and dragging your curve downward will darken existing pixels. The actual pixels in your image being lightened or darkened depends on the location of the changes you are making on your curve. This is where nodes come in.
Creating a Curve
A node is a point you create on your curve. You can create a node without moving the curve by ctrl+clicking on the curve where you’d like to add a node (as demonstrated by the node pointed out by the red arrow in the above photo). You can remove the node by clicking and dragging it outside the grid. (I clicked the “Reset Channel” button to reset the curve back to its default position)
If you want to create a node and have the curve snap to the node, simply click anywhere on the grid (as I did with the node denoted by the red arrow in the image above). (Once again, I clicked the “Reset Channel” button to reset the curve back to its default position)
For example, let’s say I wanted to make an adjustment to the area I pointed out that contains a lot of darker pixels. I want to make these pixels lighter. I can ctrl+click on my linear curve to create a node near that area (red arrow in the above photo).
Next, to make these pixels brighter, I can click and drag that node upwards (the red arrow in the image above shows the node’s new location). As I do this, the diagonal line will start to bend and become a curve.
You’ll notice my image now appears lighter. This is because all of the areas (highlighted with yellow stripes in the image above) where my curve is bending upwards away from the original diagonal line are now being made lighter. The further away the curve is from the original line (green arrow denoted the original diagonal line), the lighter the pixels will be.
If I mark the original point where this pixel is on my Input range (green dotted line leading to a red dot), and then mark the new point where it is on my Output range (green dotted line leading to a blue dot), you’ll see that the pixel is now closer to the white portion of the Output range than it was on the Input range (where it was closer to black). This is more obvious in the “Input” and “Output” fields below the curve, which display the exact numerical value of the node. The Input was originally 17.12, but we moved it upwards so now the Output value is 29.11.
It is important to note that because this is a curve, there are many pixels that will be affected by the change. However, you can mitigate some of these affects by creating more points along the curve. More on this in a moment.
I can reset my curve on the Value channel by clicking the “Reset channel” button above the grid (red arrow in the image above).
Adjusting the Brightness
For those of you familiar with the Levels tool, you’ll remember that you can adjust the shadows and highlights sliders (red arrows in the photo above) so that your black point is set to the darkest pixels in your histogram, and the white point is set to the brightest pixels in your histogram. In this case, the blank spaces on the far-left and far-right of the histogram mean that there are little to no pixels with these values.
With the curves tool, we don’t have sliders for the shadows and highlights. Instead, we have endpoints for our curve. We can use these endpoints to create essentially the same effect as the levels tool.
For example, to change the blackpoint of our image with the curves tool, I can click and drag the node in the bottom left corner (blue arrow in the photo above) of the grid to the right (making sure it stays on the bottom of the grid). What this does is increases the value on the Input range (the bottom gradient) while keeping the output range (the left gradient) set to black. It’s changing which original pixels in your image will now represent black pixels.
To change the white point, I can click and drag the node in the top right corner (red arrow) to the left – making sure the node stays at the top of the grid. This shifts the original Input range value to the left while keeping the output range value set to pure white. In other words, it is changing which original pixels in your image will now represent white pixels.
This helps correct some of the brightness and contrast problems the current image has, making it look slightly more appealing.
Now, with the new black and white points set, let’s say I wanted to once again increase the value of those darker pixels that are spiking our histogram. This time, though, I want to ensure I don’t also make my bright pixels brighter. To ensure this, I can first create what’s called an anchor node at the point where I don’t want my curve bending.
I’ll ctrl+click on the area on my curve where I want the curve to stop bending (red arrow in the image above).
Next, I’ll click on the area of my curve where I want to brighten my pixels. The curve will snap to that new point (blue arrow). The pixels to the right of my anchor node have remained untouched, whereas the darker pixels are now brighter.
If I click the “Split View” option (red arrow in the image above), you can see my new image on the left side of the preview line (blue arrow), and the original on the right. I’ll uncheck Split View to turn it back off.
Below the curve you’ll notice there are some other settings. First, there is the Input and Output values (outlined in blue in the image above). These values, which I discussed briefly earlier, display the precise location of your node on the grid. The Input value is what the pixel value was before it was changed. The Output value is the new value. If the Output value is higher than the Input value, it means the pixel is brighter than it was originally. If the Output value is lower, it means the pixel is now darker than the original. Finally, if the values are the same, it means the pixel value hasn’t changed.
Next to Input and Output values, you can select the type of curve you want connecting each node. By default, this value will be set to “Smooth.” This will draw a curve with smooth lines that run through your nodes.
If you want the curve to be straight lines connecting your nodes, you can choose the “Corner” option (red arrow in the image above). Note that only the current active node will have its curve changed. If you want to change all curves to straight lines, you’ll have to click on each node and then click on the “corner” type. For this example, I clicked on the node on the left-side of the histogram and clicked the “corner” icon. The curves became straight, which slightly changed the look of my image. I’ll click “smooth” to change it back.
Below these settings there is another setting labeled “Curve type” (green arrow in the photo above). By default, this is set to smooth – which uses the traditional method of adding nodes to the curve to change its shape. However, you can also change the mode to “Freehand” if you would prefer to hand draw the curve with your mouse or tablet.
Now that we have a pretty good idea of how the curves tool works, let’s move on to the color channels.
Adjusting Image Colors
I’ll change the channel I am working on from “Value” to our first color, “Red” (red arrow in the photo above).
The Red channel – and all color channels for that matter – works a little differently than the Value channel. Instead of making pixels brighter or darker, making changes to the Output range value will either make that pixel more saturated with red, or more saturated with cyan.
This is why the Output range gradient on the left side of the Histogram (green arrow in the image above) goes from red to black rather than from white to black (although, in my opinion, the gradient should probably go from red to cyan).
For the Input range (blue arrow), the left side represents how much red is in the darker pixels (shadows) in the image, while the right side represents how much red is in the brighter pixels (highlights) in the image. The taller the bars in the histogram, the more instances there are of red in those pixel values.
For this image, you’ll see the histogram is skewed left (highlight by green in the above image), which means there are more reds in the shadows of the image than the highlights, as well as a big spike of red near the darker end of the histogram (blue arrow). There is a large gap on the far right, indicating there isn’t much red in the highlights of the image.
If I wanted to add cyan to the shadows of the image, I could ctrl+click to create a node on the left side of the curve (blue arrow in the photo above). I’ll also ctrl+click to create an anchor node in the middle of the curve to make sure I don’t add cyan to the highlights (green arrow).
Now, if I click and drag the node downwards (green arrow in the photo above), cyan will be added to the shadows of my image. The anchor node (red arrow) keeps the rest of the curve anchored to the original linear curve.
I can also add red to the highlights of the image by clicking to create a third node to the right of my middle node, then dragging this node upwards (blue arrow).
I’ll now move on to the green channel (blue arrow in the image above).
The same rules apply here – except lowering the output value will add magenta to the image, while raising the output value will increase the saturation of green.
In this case, since I am OK with adding magenta throughout all pixel values of the image, I will only create a single node and drag it downwards (red arrow in the image above). This will add more magenta saturation to areas near the node, and will still add a more subtle amount of magenta to the highlights of my image.
Finally, I switch my channel to the blue channel (red arrow in the image above). Increasing my output value will add blue saturation to pixels in that corresponding area of the histogram, and decreasing output values will add yellow saturation.
The histogram for the blue channel shows me that there is a spike in blue in the shadows of my image. Similar to the green channel, I’ll correct this by adding a single node near that spike (red arrow in the image above). I also lowered the output value for the highlights by dragging the far-right node down a little bit on the far-right side of the grid (green arrow). This tells GIMP that the brightest pixels in my image will contain less blue (the input value of 100 was reduced to 90.68).
If I wanted to save these adjustments as a preset so that I could easily access them for another image, I can click the “+” icon next to the Preset dropdown box (red arrow in the image above). This will prompt me with a dialogue to set a name for the preset (green arrow). I went with “Basic Curves Adjustment” as the name. Click OK. Now this preset is stored in the preset dropdown for future use.
When I’m ready to apply my changes to my curve, I’ll click OK. The image now appears to be balanced better in terms of brightness and color.
I can make additional correction to the image with another instance of the Curves tool. I’ll once again go to Colors>Curves (red arrow).
This time, I want to add some more contrast to my image. To do this, I can create what’s called an “S” curve. This curve shape is very commonly used to darken your shadows and brighten your highlights, which will add universal contrast to the image.
To create this shape, I can simply add a node towards to shadows of the image and drag it downwards (red arrow in the image above). Next, I’ll add a node towards the highlights of my image and drag it upwards (green arrow). You’ll see our curve now resembles an “S.”
If this creates too much contrast, you can also drag the outermost nodes inwards towards the center of your grid to flatten it out a bit (red and green arrows in the image above).
A Split View (red arrow) shows our new image now contains more contrast. I’ll click OK to apply the changes.
A reverse S curve will do the opposite – it’ll make your shadows lighter and your highlights darker. This will also add contrast, but product a different result.
Inverting the curve (dragging the bottom left node to the very top and the top right node to the very bottom – red arrow in the image above) will produce the same effect as going to Colors>Invert.
The Curves tool is just one of several tools that can be used to adjust the Brightness/Contrast and Colors of your image. It works best when combined with other tools like the Shadows-highlights tool, the Saturation tool, and a sharpening tool (as I did to create the final image below).
That’s it for this tutorial! Hopefully you liked it. If you did, you can check out any my GIMP Help Articles, GIMP Video Tutorials, or GIMP Premium Classes and Courses.