Раскрасить изображение в градациях серого - PullRequest
3 голосов
/ 13 января 2012

У меня есть изображение в градациях серого, которое нужно закрасить значениями из градиента 5 цветов.Светлые пиксели должны получить более светлый цвет от градиента, темные пиксели должны стать более темным.

Если градиент начинается с желтого и заканчивается красным, то белые пиксели будут желтыми, а черные - красными, все междувдоль градиента.

Можно ли это сделать с ColorMatrix?

Ответы [ 3 ]

2 голосов
/ 15 января 2012

Вы упомянули «пять цветов», но также градиент от красного к желтому.

Чтобы проиллюстрировать основную идею, мы можем сгенерировать массив Color из байтового массива, где байтовый массив представляет 8-битные значения оттенков серого исходного изображения.

  • Значение 0 в оттенках серого (черный) отображается на красный, то есть Color.FromArgb (255,0,0)
  • Значение оттенка серого 255 (белый) отображается на желтый, то есть Color.FromArgb (255,255,0)

Чтобы найти новый цвет градиента (r, g, b) по значению серой шкалы (8 бит), выполните следующие действия:

  1. Установите для красного компонента значение 255
  2. Установите для компонента Blue исходное значение серого (0 - 255)
  3. Установите зеленый компонент на 0

Пример кода для преобразования из байтового массива в цветовой массив:

byte[] bytes = getImageBytes();
Color[] colors = new Color[bytes.Length];  

for(int i = 0; i < bytes.Length; i++)
{
    colors[i] = Color.FromArgb(255, bytes[i], 0);
}

Чтобы быстро выполнить эту операцию, используйте код «биты блокировки / разблокировки» и напрямую управляйте значениями байтов.

http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx

2 голосов
/ 16 января 2012

В простейшем случае вам нужна линейная интерполяция между 5 точками в 3d. Прямой градиент цвета между двумя цветами {r1, g1, b1} и {r2, g2, b2}, как если бы вы пошли на линию в 3d, которая соединяет точки {r1, g1, b1} и {r2, g2, Би 2}. Когда ваши значения серого находятся в интервале [0,1], тогда вы захотите иметь цвет {r1, g1, b1}, если у вас уровень серого 0 и {r2, g2, b2}, если у вас есть уровень серого 1. Вопрос в том, как рассчитать цвета между ними:

вспомните простой школьный векторный анализ. c1 - точка {r1, g1, b1}, c2 - {r2, g2, b2}. Начните с c1 и двигайтесь в направлении вектора c2-c1:

outColor = c1 + серый * (c2-c1)

или эквивалентно

outColor = (1-серый) c1 + серый c2

Ременбер, серый должен лежать в интервале [0,1]. В противном случае вы должны изменить его масштаб. Это простая линейная интерполяция между двумя точками, которая, конечно, может быть расширена на любое количество цветов.

Для пяти цветов подход в основном одинаков. Здесь для 5 случайно выбранных цветов:

{{0.273372, 0.112407, 0.0415183}, 
 {0.79436,  0.696305, 0.167884}, 
 {0.235083, 0.999163, 0.848291}, 
 {0.295492, 0.780062, 0.246481}, 
 {0.584883, 0.460118, 0.940826}}

enter image description here

Две важные вещи, которые вы должны знать:

  1. Если вы хотите получить цвет для заданного значения серого, вам сначала нужно извлечь две окружающие точки RGB. Например, если вы хотите иметь цвет для серого = 0,1, это будет первая и вторая точки rgb.

  2. Вы должны изменить масштаб значения серого цвета в соответствии с количеством цветов, которые вы используете в градиенте. Посмотрите на изображение с 5 цветами, у вас есть 4 разных двухточечных интервала интерполяции . Если вы хотите, чтобы вышеупомянутая формула цвета работала, вам необходимо изменить масштаб вашего значения серого для каждого цветового интервала до [0,1].

Примечание: Это, конечно, не решение для реализации в C #, но ваш вопрос предположил, что создание цветного изображения того же размера не было вашей проблемой. Вычисление значений цвета для каждого значения серого является ключом для вашей раскрашивания.

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

Вы можете просто перебрать все пиксели изображения в градациях серого и взять его значение Яркость и Альфа (проще всего с помощью LINQ).Затем вы берете желаемый цвет и используете его оттенок, насыщенность и яркость.

Теперь вы создаете новый цвет, беря Grey.Alpha, Color.Hue, Color.Saturation и комбинацию Gray. Brightness и ColorЯркость и примените этот цвет к пикселю в изображении в градациях серого.

Первые сложные моменты - это создание цвета из Альфы, Оттенка, Насыщенности и Яркости, но вы можете просто взять эту функцию; -) .

Последняя сложная часть состоит в том, чтобы объединить яркость серого и цвет и оставлена ​​в качестве упражнения для читателя.; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...