Как применить градиент от синего к желтому на растровом изображении с помощью кода, яркость как фактор - PullRequest
2 голосов
/ 12 января 2012

Мне нужно применить синий к желтому градиент к растровому изображению.Фактором здесь является яркость.Темные области фотографии должны быть голубоватыми, а самые яркие области - желтыми.Таким образом, яркость каждого пикселя должна приниматься как фактор.

Может кто-нибудь помочь мне, как сделать это в C ++ или Java?Входные данные представляют собой массив целочисленных значений rgb исходной фотографии.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Звучит как домашнее задание, но вот общая идея, или, по крайней мере, как бы я это сделал.

Для каждого пикселя вычислите среднюю яркость, поэтому сложите вместе R G и B, а затем разделите на 3, чтобы получить результат (здесь вам понадобится переменная больше 8 бит!)

Теперь у вас есть значение обратно в диапазоне 0-255, указывающее яркость пикселя (есть различные способы для вычисления яркости, но пока это подойдет).

Полный синий - (0,0,255), полный желтый - (255,255,0) - поэтому вам необходимо выполнить интерполяцию между этими значениями (здесь мы будем использовать линейную интерполяцию):

Если ваша яркость равна 50, например, это ~ 20% от 255, поэтому вы хотите, чтобы цвет был 80% синим и 20% желтым. Вы можете вычислить значение для красного канала следующим образом:

R = (brightness / max) * (R in Yellow - R in Blue);

С аналогичными расчетами для других каналов, поэтому для нашего пикселя с яркостью 50 мы бы сделали:

R = (50 / 255) * 255;
G = (50 / 255) * 255;

Конечно, у нас не может быть отрицательных значений, и использование идеи B in Yellow - B in Blue не приведет к сокращению его для синего канала, вам нужно инвертировать интерполяцию. Взяв нашу 0,2 и вычитая ее из 1, мы можем работать в диапазоне 0-255 в другом направлении:

B = (1 - (50 / 255)) * 255;

Дополнительное примечание: для работы с чем-то подобным в C ++ я бы предложил использовать SDL, это очень удобно и просто.

0 голосов
/ 12 января 2012

Если я вас правильно понял, следующее (применительно ко всем пикселям по отдельности) должно делать то, что вы хотите:

// max_value gives the maximum allowed value for red, green and blue; that is,
// if red, green and blue are all equal to max_value, you have full white)
change_pixel(int& red, int& green, int& blue, int max_value)
{
  blue = (red+green+blue)/3;
  red = green = (max_value-blue);
}
...