Генерация colormaпа

Тема в разделе "WASM.GRAPHICS", создана пользователем KingT, 18 май 2009.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Есть спектр видимого света(750-400)nm.Я хочу получить цвет с длиной волны 524nm.Как расчитать компоненты RBG для него?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Чтобы точно и математически строго - никак - это совсем разные модели - цвету с заданной длиной волны можно подобрать смесь базовых цветов, которые будут визуально похожы, но по физической сути это разные явления и потому прямой формулы преобразования не существует.
    Если же интересует только визуальное сходство, то можешь сам сделать шкалу для преобразования:
    Красный 620-780
    Оранжевый 585-620
    Желтый 575-585
    Желто-Зеленый 550-575
    Зеленый 510-550
    Голубой 480-510
    Синий 450-480
    Фиолетовый 380-450
    В середину указанных диапазонов ставишь "чистый" цвет, для которого RGB модель известна, а то что между ними интерполируешь плавным перетеканием цвета между соседними, тогда для любого спектрального цвета сможешь получить его визуальный аналог на основе смеси цветов.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Y_Mur

    Избыточно, т.к. глаз всеравно не видит все семь цетов. Достаточно сделать тоже самое для трех гармоник: красного, зеленого и синего.
     
  4. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    Пиксель монитора состоит из 3х частей:RGB.Когда я в OpenGL даю команду закрасить полигон цветом я указываю три компоненты цвета которые затем подаются на этот пиксель.Как же получаюся оттенки?Где смешиваются цвета?Над самим пикселем?Или оттенки это иллюзия глаза?

    >>которые будут визуально похожы, но по физической сути это разные явления
    Если я вижу на экране монитора оттенок значит в мой глаз приходит волна с промежуточной длинной волны,тоесть физически получаем нужную длинну волны

    >>В середину указанных диапазонов ставишь "чистый" цвет
    Буду пробывать
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    KingT

    > Где смешиваются цвета?Над самим пикселем?Или оттенки это иллюзия глаза?

    Возьми линзу и посмотри через нее на экран включенного телевизора.
     
  6. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    208
    >>Возьми линзу и посмотри через нее на экран включенного телевизора
    Смотрел.Никаких оттенков там нет.Видно только RGB.А когда смотрим издалека то кажется что есть оттенки.

    Вот нашел у Хилла апроксимацию надо только функцию подобрать.
    [​IMG]
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    KingT

    Все правильно. CRT моделирует цвет также как его видит глаз - тремя rgb-фонариками на каждый пиксель (на сетчатке у нас пиксели тоже состоят из троек rgb-приемников).
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    KingT
    Цвета "смешиваются" в глазе - т.е. это свойство глаза одинаково воспринимать и цвет с определённой длиной волны и "эквивалентную" смесь других цветов. Если этот смешанный цвет подать на призму cпектроскопа то он покажет что монохромный и "смешанный" цвета это совсем разные явления. Кроме того люминофор монитора не обязан генерировать спектрально чистые цвета - т.е. красный, синий, зелёный цвета в составе мониторного пиксела это не ярко выраженные спектральные линии соответствующего цвета, а уже "жуткая каша" из разных длинн волн, которые в совокупности воспринимаются глазом как "достаточно" красный, "достаточно"синий и "достаточно" зелёный ;) Т.е. в итоге RGB это "смесь из смесей".

    Не понял как это у Хилла красный цвет может быть отрицательным? - это что за модель супер-пупер-RGB?
    Если задача отобразить цвет на экране монитора то вполне достаточно линейной интерполяции, хотя квадратичная, безье, сплайновая и т.п. бдут смотреться немного лучше.

    Естественно эту интерполяцию нужно делать покомпонентно - т.е. взять шкалу как в #6, отметить на ней точки R, G, B компонент взятые из соответсвующих цветов, для которых длина волны известна, например из сопоставления #2 и GdiPlusColor.h
    Код (Text):
    1.         Blue                 = 0xFF0000FF,
    2.         Cyan                 = 0xFF00FFFF,
    3.         Green                = 0xFF008000,
    4.         GreenYellow          = 0xFFADFF2F,
    5.         Magenta              = 0xFFFF00FF,
    6.         Orange               = 0xFFFFA500,
    7.         Red                  = 0xFFFF0000,
    8.         Yellow               = 0xFFFFFF00,
    9.         YellowGreen          = 0xFF9ACD32
    10.         ...
    Затем эти покомпонентные точки соединить либо прямыми линиями, либо сплайнами и т.п. - получится 3 графика похожие на #6, но без непонятных отрицательных цветов.

    _DEN_
    А всего по трём точкам такой график не построишь ;) - нужны известные точки разбросанные по всему диапазону длинн волн, и чем больше тем лучше.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Да и ещё GdiPlusColor.h не следует рассматривать как "физический справочник", -это просто одна из версий сопоставления цветов и их названий (а названия как раз и нужны для сопоставления с длинной волны :) например яркость green цвета в GdiPlusColor.h занижена до 128, против red яркости 255. Не обязательно эту слепо повторять - в идеале вообще иметь под рукой спектроскоп с набором специальных ламп генерирующих ярко выраженные спектральные линии и поигравшись с компонентами цветов аналогичного названия добиться визуального совпадения цвета в спектроскопе с цветом на мониторе, но такая калибровка будет "точной" только для твоей конкретной связки глаз+монитор, а на другом мониторе или у другого человека будет несколько отличаться потому и не существует "физически узаконенной" формулы преобразования спектра в RGB.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    _DEN_
    Отчасти ты прав - глаз действительно разделяет цвет на компоненты - я не уверен что в глазу именно RGB, но именно за счёт компонетности зрения глаз и видит монохромный и аналогичный ему смешанный цвета почти одинаково. Но именно почти - в физике существует понятие "чистоты цвета", которое как раз и характеризует отличие цвета с одной длиной волны от "эквивалентного смешанного". Чтобы получить об этом визуальное представление достаточно посмотреть на отражение солнца в дифракционной решётке (вместо неё сгодится любой CD/DVD диск). Цвета радуги которые видны в этом отражении намного насыщеннее и чище (трудно подобрать этим цветам более удачный термин чем чистота), чем цвета воспроизводимые мониторами. Аналогично выглядит цвет луча лазерной указки. Если смотреть на любой источник света через щелевой спектроскоп (не важно призменный или дифракционный), который способен показать крупным планом спектральную линию соответсвующего цвета, то это различие между "чистым" и "обычным" цветом ещё более очевидно, чем на CD диске. А это означает что глаз всё таки кроме компонентного механизма имеет ещё и "датчик чистоты цвета". Не знаю как это физиологически устроено, но что работает это точно - сам в спектроскоп смотрел.

    KingT
    Люминофор обычных мониторов имеет обычный линейчато-непрерывный спектр, т.е. светит во всём видимом диапазоне длин волн и на фоне этого непрерывного спектра выделяются отдельные линии повышенной яркости, примерно так:
    [​IMG]
    А общее распределение интенсивности свечения разных областей спектра такова, что глаз видит преобладание красного, синего или зелёного цвета в компоненте пикселя.
    Исключением из этого правила являются только лазерные мониторы, где RGB компоненты формируются лазерной развёрткой и там однокомпонентные цвета действительно монохромны, а шумовой фон из других длинн волн отсутвует и сложения самих базовых цветов из множества других тоже нет. Экспериментальные модели таких телевизоров/мониторов появились давно, а вот серийных образцов до сих пор не видно - думаю дело тут как раз в способности глаза отличать чистый цвет от "нечистого" ;). Изображение на лазерном мониторе должно отлично подходить для воспроизведения рисованной графики где чистые цвета будут смотреться очень эффектно, но в природе чистые цвета практически не встречаются - не существует ни одного вещества, которое бы при нагреве, электрическом воздействии и т.п. светило бы только одной длиной волны, или выделяло только её при отражении. А потому изображения природы на лазерном мониторе должны сильно "отдавать мультяшностью" и резать глаз своей неестественностью :)

    А графики из #6 явно не соответствуют преобразованию спектра в RGB - поскольку фиолетовый (magenta) цвет расположен левее синего и имеет существенную красную составляющую, а на тех графиках там только какой-то жалкий ошмёточек красного.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Y_Mur

    Так для моделирования, на которое будет смотреть человек, это и не нужно - все равно он не увидит отличий.


    Y_Mur

    Если не ошибаюсь, то именно RGB. А "чистый" цвет он хоть и отличается от смесей, но, также если не ошибаюсь, кажется нам "чистым" как раз потому что он имеет хорошую ровную яркость и "удобно" ложится на наши RGB-колбочки. То есть, опять же, если не ошибаюсь, то человек не отличит чистый желтый от смеси чистого красного и чистого зеленого.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    _DEN_
    Не путай количество компонент и количество контрольных точек для постороения графика - глаз намного более тонкий и чуствительный инструмент чем это может показаться на первый взгляд :))

    KingT
    Вот кстати попалась классная статья по теме, там есть и спектры для мониторов (честно говоря я ожидал от них гораздо большей "загрязнённости" базовых цветов :) и авторы даже ухитрились снять график разложения спектра в RGB экспериментально :))
    [​IMG]
    Правда сделано это для лампы накаливания, но всё равно это уже похоже на правду. В идеале будет направить их приспособление на яркое солнце и подобрать выдержку, чтобы графики не зашкаливали, и будет искомое преобразование (с поправкой на свойства, фотоматрицы, но это не столь важно).

    _DEN_
    Как выглядит смесь чистого красного и чистого зелёного ни разу не видел, а вот то что чистые цвета (любая спектральная линия крупным планом) видимые в окуляр спектроскопа заметно отличаются от тех же цветов, запечатлённых на фотографии (их можно посмотреть в той статье), это видел сам :) причём чем чище цвет ("очистка" достигается настройкой масштаба в спектроскопе) тем это отличие больше.
    В первом приближении это отличие можно увидеть сопоставляя радугу от сонца отражённого в лазерном диске с теми спектральными фотографиями - но просто отражение в CD, это достаточно грубая и предварительная "очистка" цветов :))
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Не совсем внимательно посмотрел статью в первый раз - есть у них там солнце - самый спектрально равномерный источник света из общедоступных :) достаточно удалить из него провал Фраунгофера и можно использовать как фукцию преобразования.
    [​IMG]
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Фотографию нельзя сравнивать с реальным источником - разница будет хотя бы потому что фотография полноценно не передает параметры источника света, и чистота спектра тут не при чем. Попробуй сфотографировать солнце так, чтобы глядя на фотографию человек морщился так, как будто он смотрит на настоящее солнце.
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    _DEN_
    Да глубина цвета у глаза намного больше чем 8бит на компонент у фотоаппаратов и мониторов, но дело не только в этом, а ещё и в том что в самом спектроскопе чистота цвета отличается при грубом и точном масштабировании, трудно словами объяснить как выглядит чистота :), но это совершенно точно не "оттенок", а нечто другое и глазом это "нечто" видно :))
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Кстати когда понятие чистоты цвета объясняли на лекциях, я тоже не особо понял о чём же идёт речь - цвет он и есть цвет, а когда дошло до лабораторных со спектроскопом, то сначала заметил это отличие, полюбовался им поудивлялся откуда же оно берётся, а потом только дошло, что это и есть та самая чистота цвета :))