Algorithm for changing the brightness of an RGB image?

I know that there is a formula for the RGB β†’ Luminance transition, but I need to set the brightness parameter to change the RGB values ​​of the image. How to do it?

thanks

+4
source share
6 answers

Map from RGB to HSL (hue / saturation / brightness), keep the hue and saturation the same and just change the brightness, and then reverse the mapping from HSL to RGB.

Here you can learn more about converting RGB to HSL and HSL to RGB.

If you need more information, you should ask a more specific question.

+13
source

The easiest way is to multiply each of the values ​​of R, G, B by some constant - if the constant is> 1, it will make it brighter, and if <1, it will become darker. If you make it brighter, you should check each value to make sure it does not exceed the maximum value (usually 255).

Not only is this easier than translating from RGB to HSL and vice versa, but it comes closer to what happens when you shine a different amount of light on a physical object.

+15
source

Adding to Mark Ransom Answer: It would be better to use the specified factor with a constant of 255 and add it to the current color value:

float brightnessFac = //between -1.0 and 1.0 byte brightnessRed = red + (255f * brightnessFac); 

If you just do with a ratio between 0.0 and 1.0

 byte brightnessRed = red * brightnessFac; 

The value 0 remains equal to zero.

+2
source

My recommendation would be the same as ChrisA. answer, with one difference:

Use HS P color space , as it is an approximation of the Photoshop algorithm and has better results.


For the sake of not only links to the HSP site (which, frankly, should be more than enough, I just don’t like to answer without examples), here is my C# implementation that follows the site:

 #region Definitions //Perceived brightness to Red ratio. private const double Pr = .299; //Perceived brightness to Green ratio. private const double Pg = .587; //Perceived brightness to Blue ratio. private const double Pb = .114; #endregion //Expected ranges: Hue = 0-359... Other values = 0-1 public static ColorRGB ToRGB(double hue, double saturation, double perceivedBrightness, double alpha) { //Check values within expected range hue = hue < 0 ? 0 : hue > 359 ? 359 : hue; saturation = saturation < 0 ? 0 : saturation > 1 ? 1 : saturation; perceivedBrightness = perceivedBrightness < 0 ? 0 : perceivedBrightness > 1 ? 1 : perceivedBrightness; alpha = alpha < 0 ? 0 : alpha > 1 ? 1 : alpha; //Conversion var minOverMax = 1 - saturation; double r, g, b; if (minOverMax > 0) { double part; if (hue < 0.166666666666667D) { //R>G>B hue = 6 * (hue - 0); part = 1 + hue * (1 / minOverMax - 1); b = perceivedBrightness / Math.Sqrt(Pr / minOverMax / minOverMax + Pg * part * part + Pb); r = b / minOverMax; g = b + hue * (r - b); } else if (hue < 0.333333333333333D) { //G>R>B hue = 6 * (-hue + 0.333333333333333D); part = 1 + hue * (1 / minOverMax - 1); b = perceivedBrightness / Math.Sqrt(Pg / minOverMax / minOverMax + Pr * part * part + Pb); g = b / minOverMax; r = b + hue * (g - b); } else if (hue < 0.5D) { // G>B>R hue = 6 * (hue - 0.333333333333333D); part = 1 + hue * (1 / minOverMax - 1); r = perceivedBrightness / Math.Sqrt(Pg / minOverMax / minOverMax + Pb * part * part + Pr); g = r / minOverMax; b = r + hue * (g - r); } else if (hue < 0.666666666666667D) { //B>G>R hue = 6 * (-hue + 0.666666666666667D); part = 1 + hue * (1 / minOverMax - 1); r = perceivedBrightness / Math.Sqrt(Pb / minOverMax / minOverMax + Pg * part * part + Pr); b = r / minOverMax; g = r + hue * (b - r); } else if (hue < 0.833333333333333D) { //B>R>G hue = 6 * (hue - 0.666666666666667D); part = 1 + hue * (1 / minOverMax - 1); g = perceivedBrightness / Math.Sqrt(Pb / minOverMax / minOverMax + Pr * part * part + Pg); b = g / minOverMax; r = g + hue * (b - g); } else { //R>B>G hue = 6 * (-hue + 1D); part = 1 + hue * (1 / minOverMax - 1); g = perceivedBrightness / Math.Sqrt(Pr / minOverMax / minOverMax + Pb * part * part + Pg); r = g / minOverMax; b = g + hue * (r - g); } } else { if (hue < 0.166666666666667D) { //R>G>B hue = 6 * (hue - 0D); r = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pr + Pg * hue * hue)); g = r * hue; b = 0; } else if (hue < 0.333333333333333D) { //G>R>B hue = 6 * (-hue + 0.333333333333333D); g = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pg + Pr * hue * hue)); r = g * hue; b = 0; } else if (hue < 0.5D) { //G>B>R hue = 6 * (hue - 0.333333333333333D); g = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pg + Pb * hue * hue)); b = g * hue; r = 0; } else if (hue < 0.666666666666667D) { //B>G>R hue = 6 * (-hue + 0.666666666666667D); b = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pb + Pg * hue * hue)); g = b * hue; r = 0; } else if (hue < 0.833333333333333D) { //B>R>G hue = 6 * (hue - 0.666666666666667D); b = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pb + Pr * hue * hue)); r = b * hue; g = 0; } else { //R>B>G hue = 6 * (-hue + 1D); r = Math.Sqrt(perceivedBrightness * perceivedBrightness / (Pr + Pb * hue * hue)); b = r * hue; g = 0; } } return new ColorRGB(r, g, b, alpha); } //Expected ranges: 0-1 on all components public static ColorHSP FromRGB(double red, double green, double blue, double alpha) { //Guarantee RGB values are in the correct ranges red = red < 0 ? 0 : red > 1 ? 1 : red; green = green < 0 ? 0 : green > 1 ? 1 : green; blue = blue < 0 ? 0 : blue > 1 ? 1 : blue; alpha = alpha < 0 ? 0 : alpha > 1 ? 1 : alpha; //Prepare & cache values for conversion var max = MathExtensions.Max(red, green, blue); var min = MathExtensions.Min(red, green, blue); var delta = max - min; double h, s, p = Math.Sqrt(0.299 * red + 0.587 * green + 0.114 * blue); //Conversion if (delta.Equals(0)) h = 0; else if (max.Equals(red)) { h = (green - blue) / delta % 6; } else if (max.Equals(green)) h = (blue - red) / delta + 2; else h = (red - green) / delta + 4; h *= 60; if (h < 0) h += 360; if (p.Equals(0)) s = 0; else s = delta / p; //Result return new ColorHSP(h, s, p, alpha); } 
+2
source
 import java.io.*; import java.awt.Color; import javax.imageio.ImageIO; import java.io.*; import java.awt.image.BufferedImage; class psp{ public static void main(String a[]){ try{ File input=new File("abc.jpg"); File output=new File("output1.jpg"); BufferedImage picture1 = ImageIO.read(input); // original BufferedImage picture2= new BufferedImage(picture1.getWidth(), picture1.getHeight(),BufferedImage.TYPE_INT_RGB); int width = picture1.getWidth(); int height = picture1.getHeight(); int factor=50; for (int y = 0; y < height ; y++) {//loops for images for (int x = 0; x < width ; x++) { Color c=new Color(picture1.getRGB(x,y)); int r=c.getRed()+factor; int b=c.getBlue()+factor; int g=c.getGreen()+factor; if (r >= 256) { r = 255; } else if (r < 0) { r = 0; } if (g >= 256) { g = 255; } else if (g < 0) { g = 0; } if (b >= 256) { b = 255; } else if (b < 0) { b = 0; } picture2.setRGB(x, y,new Color(r,g,b).getRGB()); } } ImageIO.write(picture2,"jpg",output); }catch(Exception e){ System.out.println(e); } } } 
0
source

Adjusting the brightness of the image is one of the simplest image processing operations that you can perform. All that is involved adds the desired brightness change to each of the components of red, green, and blue.

it will look something like this:

 colour = GetPixelColour(x, y) newRed = Truncate(Red(colour) + brightness) newGreen = Truncate(Green(colour) + brightness) newBlue = Truncate(Blue(colour) + brightness) PutPixelColour(x, y) = RGB(newRed, newGreen, newBlue) 

Code so that the new red, green, and blue values ​​are in the valid range.

 Procedure Truncate(value) If value < 0 Then value = 0 If value > 255 Then value = 255 Return value EndProcedure 
-4
source

All Articles