Я знаю, что есть формула для перехода RGB -> Luminance, но мне нужно задать параметр яркости, чтобы изменить значения RGB изображения. Как мне это сделать?Алгоритм изменения яркости изображения RGB?
Благодаря
Я знаю, что есть формула для перехода RGB -> Luminance, но мне нужно задать параметр яркости, чтобы изменить значения RGB изображения. Как мне это сделать?Алгоритм изменения яркости изображения RGB?
Благодаря
Карта из RGB в HSL (Hue/насыщенность/яркость), сохранить оттенок и насыщенность же, а просто изменить яркость, а затем сделать обратное преобразование из HSL в RGB.
You can read more about the RGB to HSL and HSL to RGB transformations here.
Если вы хотите более подробно, чем вы должны задать более конкретный вопрос.
Самый простой способ - умножить каждое значение R, G, B на некоторую константу - если константа> 1, она сделает ее ярче, и если < 1 будет темнее. Если вы делаете это ярче, вы должны проверить каждое значение, чтобы убедиться, что оно не превышает максимальный (обычно 255).
Не только это проще, чем перевод с RGB на HSL и обратно, но он более близко приближается к тому, что происходит, когда вы светете другое количество света на физическом объекте.
Да, получается точная вещь под моделью 'L = (R + G + B)/3', но некоторые модели яркости не используют это предположение (см. Страницу Wikipedia, с которой я связан.) Поскольку ОП был расплывчатым, я решил быть «общим». –
@ChrisA. действительно ли это работает на одно и то же? Я думал, что существует некоторое взаимодействие между L и S, например, что действительно плохо, если вы делаете радикальные изменения. –
Хорошая точка! Именно поэтому я попытался принять как можно меньше в своем ответе и оставить его общим. Я помню, что узнал, что это происходит, хотя Марк, но сейчас я пытаюсь это сделать, просто ради любопытства. –
Добавление Ответа Mark Ransom в: Было бы лучше использовать указанный коэффициент с константой 255 и добавить его к текущему цветовому значению:
float brightnessFac = //between -1.0 and 1.0
byte brightnessRed = red + (255f * brightnessFac);
Если вы просто делаете с коэффициентом от 0.0 1,0
byte brightnessRed = red * brightnessFac;
Значение 0 остается равным нулю.
Регулировка яркости изображения является одной из самых простых операций обработки изображений, которые можно выполнить. Все, что связано с этим, заключается в добавлении желаемого изменения яркости к каждому из компонентов красного, зеленого и синего цветов.
он бы что-то вроде этого:
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)
Код для гарантирует, что новые значения красного, зеленого и синего цвета находятся в пределах допустимого диапазона.
Procedure Truncate(value)
If value < 0 Then value = 0
If value > 255 Then value = 255
Return value
EndProcedure
Моя рекомендация будет такой же, как ответ ChrisA. «s, с одним отличием:
Используйте HSP color space вместо этого, так как это приближение алгоритма Photoshop и имеет лучшие результаты.
Ради не только ссылки на сайт ХПП (который откровенно должно быть более чем достаточно, это просто, что я не хотел бы отвечать без примеров), вот мой C#
реализация, вытекающее сайта :
#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);
}
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);
}
}
}
Неа это то, что я просил. Спасибо огромное! – user1475859