Преобразование RGB в HSL для более высокого разрешения C ++ - PullRequest
0 голосов
/ 06 мая 2011

Я пишу программу на с ++, программа должна была открыть изображение и переместить курсор вокруг изображения, чтобы прочитать температуру под курсором. Изображение имеет 14 различных цветовых пятен, и я могу прочитать цвет и преобразовать его в температуру.

Следующее, что мне нужно сделать, - это создать метод, который может визуализировать температуру с большим разрешением, то есть с более чем 14 цветными пятнами. Затем нарисуйте новое цветовое пятно в нижней части графического интерфейса на панели, чтобы проверить, могу ли я визуально различать цвета для разных температур в диапазоне от 300К до 30000К.

Я не уверен, как выполнить эту последнюю часть. Я думаю, что это как-то связано с преобразованием значений RGB в HSL, но я не вижу, как это даст мне, скажем, 28 цветовых пятен.

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 мая 2011

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

enter image description here

Я прав? Если вам нужно отобразить сотни цветов, но у вас есть только 14 цветов, вам нужно смешать смежные цвета, что называется «интерполяция».

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

Допустим, вы собираетесь визуализировать одну из цветных вертикальных линий в градиенте выше. Сначала нужно определить, какого цвета это должно быть. Допустим, горизонтальное положение вертикальной линии может быть между 0 и 99.

Затем вам нужно найти, какие два из ваших 14 цветов смешиваются между:

float x = horizontal_position * 13.f / 99.f;
int a = floorf(x);
int b = std::min( 13, a + 1 );

Теперь вам нужно смешать два цвета, чтобы найти цвет вертикальной линии:

float blend = x - a;
color result = palette[a] * (1-blend) + palette[b] * blend;

«Цвет» в псевдокоде выше может быть RGB, YUV, HSV и т. Д. Эта часть зависит от вас. Помните, что HSV является «нелинейным цветовым пространством», и поэтому линейное смешение двух цветов HSV может привести к неожиданным результатам.

1 голос
/ 06 мая 2011

Я не уверен, что точно понимаю, что вы хотите сделать, но звучит так, будто вы ищете интерполяционный алгоритм, который в основном увеличивает ваше изображение, заполняя промежутки значениями за пределами 14 цветов оригинала.

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

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