2010-10-05 2 views
1

У меня есть массив пикселей со связанной интенсивностью (как плавающий между 0 и 1), который я хотел бы преобразовать в изображение RGB.Как создать псевдо-цветное изображение в C++?

Самый простой способ - просто умножить каждое значение на 255 и назначить его R + G + B для получения изображения в оттенках серого, но я думаю, что было бы лучше использовать целый ряд цветов, чтобы показать более тонкие различия.

Насколько я знаю, это называется псевдо-ложным цветным изображением, но мне сложно найти алгоритмы для него. Сейчас я использую этот код, но мне было интересно, если бы был умнее/быстрее способ сделать это:

if(intensity <= 0.25) { 
    p->r = 0; 
    p->g = 0; 
    p->b = (intensity) * 4 * 255; 
    return; 
} 

if(intensity <= 0.5) { 
    p->r = 0; 
    p->g = (intensity - 0.25) * 4 * 255; 
    p->b = 255; 
    return; 
} 

if(intensity <= 0.75) { 
    p->r = 0; 
    p->g = 255; 
    p->b = (0.75 - intensity) * 4 * 255; 
    return; 
} 

if(intensity <= 1.0) { 
    p->r = (intensity - 0.75) * 4 * 255; 
    p->g = (1.0 - intensity) * 4 * 255; 
    p->b = 0; 
    return; 
} 

Кроме того, есть ли какие-либо стандартные цветовые палитры я должен использовать для этого?

+0

Ну, вероятно, это должно быть 'else if's, с одной стороны ... – FrustratedWithFormsDesigner

+1

Я использую return in ifs, так что это должно сделать их ненужными. – Nils

+0

О да, неважно. На самом деле это не очень привычно. – FrustratedWithFormsDesigner

ответ

3

Вместо этого вы можете использовать HSV или HSL.

Попробуйте использовать значение от 0 до 1, чтобы установить оттенок и использовать константы для насыщения и значения. Вы найдете множество примеров кода для преобразования вашего значения HSV в значение RGB.

http://en.wikipedia.org/wiki/HSL_and_HSV

Когда вы видите «искусственные цветы» изображение, это часто, что используется. Преимущество заключается в том, что все области изображения яркие, а «темные» части изображения просто выделяются другим цветом.

Если вы используете HSL, вы также можете установить Lightness на 50% для большей части вашего диапазона 0-1, но позволяя ему подниматься прямо до конца (например, от 0,9 до 1), что поможет интенсивные части вашего изображения до белого.

Другой вариант - использовать фальшивую цветочную палитру . Здесь вы просто создаете 8-битное изображение и создаете для него такую ​​палитру, которая соответствует вашим потребностям. Есть несколько хороших примеров этих here...

+0

Я предполагаю, что это сработало бы, если бы «интенсивность» OP использовалась для любого из трех значений, если остальные два были постоянными. – FrustratedWithFormsDesigner

+0

Да, но приклеивание его в оттенке создавало бы красочное изображение со всеми уровнями интенсивности. Вы также можете отображать только часть диапазона оттенков в диапазоне 0-1, поэтому вы можете создать изображение, которое идет от холодного синего до горячего желтого цвета, через красный. –

+0

Я попытался создать HSL/HSV, и это, казалось, получилось очень хорошо, спасибо! Фальшивая цветовая палитра была бы еще лучше, но у меня были некоторые проблемы с реализацией этого - есть ли на самом деле какой-то умный способ сделать это (как функция моей интенсивности), или мне действительно придется жестко кодировать все цвета? – Nils

0

Определите группу значений RGB и интенсивность, которой они будут соответствовать. Каждая из интенсивностей вашего изображения будет находиться между двумя из этих точек - вы можете умножить на константу и усечь, а затем посмотреть их в массиве. Когда у вас есть два значения RGB, интерполируйте между ними на основе расстояния между интенсивностью изображения и интенсивностью двух конечных точек.

Смежные вопросы