преобразовать пиксель RGB в длину волны

Мне нужно определить спектр, излучаемый источником света (спектрометром). Для этого мне нужно преобразовать каждый пиксель в длину волны.

Чтобы решить проблему, заключающуюся в том, что значения RGB не имеют единственного значения, я буду использовать призму, чтобы получить оптическую решетку. Таким образом, я получаю развертывание спектра, и разница в спектре только по оси X.

Мой вопрос в том, как преобразовать пиксели в длину волны и получить график интенсивности как функции длины волны.

пример


person Moti S    schedule 18.02.2016    source источник
comment
Вопрос надуманный. Не все цвета, представленные в RGB, являются монохроматическими. Например. какая длина волны белая?   -  person    schedule 18.02.2016
comment
в спектральном диапазоне нет белого yorku.ca/eye/spectrum.gif   -  person Moti S    schedule 18.02.2016
comment
@MotiS В непрерывном спектре нет комбинации трех длин волн (одна для красного, одна для зеленого и одна для синего), которые в сумме дадут вам другую единственную длину волны (если две из трех интенсивностей не равны нулю).   -  person    schedule 18.02.2016
comment
Один источник света (спектрометр) и призма не дают белого света. Призма используется для монохроматического света.   -  person Daniel    schedule 18.02.2016
comment
призма используется для получения дифракции, результат - световой спектр.   -  person Moti S    schedule 18.02.2016
comment
@ CST-Link: да, большая часть цветового диапазона представляет собой комбинацию длин волн, но, в частности, НЕ для призматического или решетчатого спектра от любого источника света.   -  person Carl Witthoft    schedule 18.02.2016
comment
@MotiS Я обновил свой спектроскоп, чтобы он мог делать снимки (до сих пор это было только для просмотра человеческим глазом), поэтому я добавил еще кое-что в свой ответ, например, линейные эталонные изображения / сюжет и мои собственные снимки с сюжетами, чтобы у вас было что-то для сравнить с ...   -  person Spektre    schedule 16.08.2018


Ответы (4)


  1. Вы должны получить wavelength с x позиции

    Вы не можете вычислить длину волны по цвету, поскольку это не одно и то же. Итак, сначала вы должны откалибровать свой спектроскоп с известными длинами волн. Из этой функции вывода:

    wavelength = f(x)
    

    либо с помощью LUT и интерполяции, либо с помощью полинома аппроксимации. Для получения дополнительной информации см .:

    Вы можете использовать солнечный свет в качестве эталона и откалибровать его на основе известных спектральных (фраунгоферовых) линий. Вот первый пример, который я нашел в Google:

    Ссылка на солнце

    Итак, возьмите / сделайте снимок солнечного света здесь, мой:

    Мой снимок солнца

    перекрестное сопоставление с линиями фраунгофера (более темные линии, остерегайтесь чрезмерно увеличенных изображений, они могут напортачить , также Интенсивность R+G+B без веса, мы не хотим человеческого восприятия, такого как преобразование) и составьте таблицу Известных длин волн x позиций на вашем изображении. Отсюда интерполируйте свой wavelength = f(x).

    Как видите, мой снимок спектров Солнца более или менее совпадает с эталонным (расхождения связаны с материалом решетки, фильтром Байера, свойствами камеры, облаками и атмосферой и т. Д.). Как бы то ни было, линии фраунгофера нелегко обнаружить по локальным минимумам, поэтому, возможно, лучше будет начать с некоторого стиля графического интерфейса пользователя, который помогает пользователю.

    Но имейте в виду, что большинство изображений спектров в Интернете неправильные, нелинейные или смещенные !!! Поэтому, чтобы убедиться, что я создал эталонный спектр из линеаризованных спектральных данных вот так и вот результат 400-700 [nm]:

    настоящие линеаризованные несмещенные спектры солнечного света

    И вот сюжет:

    график для реальных данных

    серые линии представляют собой сетку от 400 до 700 нм с шагом 10 нм.

    Вот как должна выглядеть ваша установка:

    спектрометр

    Вот изображение с моего спектроскопа (смотрит на белую область на моем ЖК-дисплее):

    Белый на моем ЖК-дисплее

    Я использую решетку из DVD, отсюда и формы дуги окружности. Теперь, если ваша камера находится в фиксированном положении относительно вашей призмы, тогда для выбранной горизонтальной линии положение пикселя по оси x напрямую соответствует определенной длине волны.

    Если вы не видите линий фраунгофера, значит, перед призмой / решеткой отсутствует апертура. Я обычно использую 2 бритвенных лезвия на расстоянии 0.1 mm, установленных тонкой бумагой. Если ваше изображение не в фокусе, вам необходимо добавить линзы перед камерой / датчиком и / или добавить дополнительную защиту от внешнего света.

    Как я уже упоминал ранее, Вы не можете получить длину волны из цвета, потому что существует «бесконечное» количество комбинаций входных спектров, создающих один и тот же отклик RGB. Например, возьмем белый цвет ... он может состоять из 3 или более различных длин волн или даже из непрерывного белого шума. Итак, из RGB вы не можете сказать, какой это ... Если вы добавите также позицию x с комбинацией призмы / решетки, вы можете получить длину волны, но это будет намного сложнее и менее точным, чем прямое преобразование из всего лишь положения x ...

  2. вычислить интенсивность из RGB

    это может быть немного сложно, так как ваш датчик может иметь разную чувствительность для разных длин волн. Вы можете нормализовать интенсивность аналогично №1. Просто сделайте снимок источника света известной интенсивности и приблизьте недостающие длины волн. Также это можно сделать с помощью солнечного света в качестве источника.

    Из нормализованного цвета вы просто вычисляете интенсивность серой шкалы, и все.

    Для повышения точности вы можете усреднить все пиксели для одного и того же x.

    Также для повышения точности и чувствительности обычно используется не цветной датчик (в основном линейные камеры) либо по дизайну, либо путем удаления Фильтр Байера, чтобы не испортить данные.

  3. постройте данные

    по оси x - длина волны, а по оси y - интенсивность. Если вы хотите применить спектральные цвета, вы можете использовать это:

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

person Spektre    schedule 01.03.2017

Поздно на вечеринку. Но вот идея для точного (близкого к научной методологии) преобразования RGB пикселя датчика в значение интенсивности на графике длины волны.

  1. Приобретите источник света известной длины волны.

Чем уже полоса излучения, тем лучше. Лазеры подходят для таких требований, но также обратите внимание на мощность и убедитесь, что она не превышает ограничений вашей матрицы. Лучше откалибровать измерительную систему с тремя длинами волн (красная, зеленая, синяя). В идеале при использовании красного лазера считывайте необработанное изображение и ищите любые накопления заряда на зеленом и синем каналах пикселя. (Поскольку каждый пиксель имеет шаблон байеровского фильтра). Если накопление слишком велико, подумайте о датчиках изображения хорошего качества. А затем следуйте методу HSV, предложенному Ноэлем Сегура Мераз. Используйте вертикальное объединение для снятого изображения. Вертикальное объединение - это место, где вы просто добавляете значения интенсивности столбца в массив датчиков. После калибровки системы с помощью этих трех лазеров смешайте и сопоставьте их, чтобы проверить, хорошо ли работает ваша функция интерполяции.

  1. Получите эффективность пикселей в ваших датчиках изображения по длине волны

Если невозможно получить эту информацию из спецификации датчика изображения, добавьте тонкую вертикальную щель в вашу оптическую установку непосредственно перед датчиком изображения, тем самым выбрав только определенную длину волны. Получите все значения интенсивности по вертикали для каждой длины волны, чтобы охарактеризовать ваш датчик изображения. Тонкая щель не должна быть настолько тонкой, чтобы вводить световые эффекты дифракции. Датчик изображения имел бы отличные характеристики, если бы он имел почти одинаковые значения интенсивности для каждой длины волны. Используйте эти данные для масштабирования графика зависимости длины волны от интенсивности, полученного на шаге 1.

  1. Перед настройкой оптики используйте широкополосный входной источник света, чтобы максимально использовать спектр

Хотя то, что вы пытаетесь достичь, абсолютно верно, это не очень точная измерительная система, поэтому она не используется исследователями / промышленностью. В настоящем спектрометре (в основном) используется дифракционная решетка, расстояние между линиями на решетке и угол падения используются для расчета разброса длин волн на ПЗС-датчике (или любом линейном массиве фотодатчиков в зависимости от факт). Обычно этот угол настраивается для достижения необходимого разброса по длине волны без потери разрешения. Вот пример от Andor для разработки системы с их продуктами.

person OpticsSoftware    schedule 07.12.2017

Если я правильно понимаю, чего вы пытаетесь достичь, это выполнимо (вроде), но для этого потребуется калибровка.

Сначала вы хотите поработать с пространством hsv, вы можете сделать это с помощью rgb2hsv

В пространстве HSV «V» или «значение» дадут вам интенсивность света данного пикселя. Это будет значение, которое вы хотите построить, чтобы получить график, который вы показываете. Вы можете получить либо среднее значение по каждому столбцу пикселей, либо просто проанализировать центральную строку, в зависимости от того, что вам больше подходит.

Теперь самое интересное. Как получить значения оси x вашего графика. Теоретически говоря, ваша призма будет разделять свет на определенные длины волн, и каждая из них будет иметь уникальное значение «H» или «оттенок», связанное с

Hue = (650 - wavelength)*240/(650-475)

подробнее об этом здесь

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

Вы можете проверить, насколько чист и идеален каждый пиксель, по значению «S» или «насыщенность». Чем выше, тем лучше.

Я бы порекомендовал вам откалибровать его вручную. Посмотрите на свой спектр и отметьте карандашом или другим предметом те цвета, длина волны которых вам известна, а затем используйте эти отметки, чтобы определить ось x вашего графика.


Я забыл упомянуть, что вам нужно выполнить калибровку только один раз, как только вы узнаете, какая длина волны соответствует оттенку в вашей камере, вы можете выполнить настройку автоматически, или даже scatter(hue_wavelenght,value) всех ваших пикселей могут работать

person Noel Segura Meraz    schedule 18.02.2016
comment
Я почти уверен, что OP использует нефильтрованный детектор, т.е. каждый пиксель реагирует (хотя и с разной эффективностью) на все длины волн. так работают спектрометры. - person Carl Witthoft; 18.02.2016

Я бы начал пытаться отменить этот код, который делает прямо противоположное тому, что вы хотите. Последний материал (% LET THE INTENSITY SSS FALL OFF NEAR THE VISION LIMITS) не имеет отношения к вашему случаю, он пытается воссоздать человеческое восприятие.

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

Вы также кратко изложили альтернативу, используя положение для определения длины волны? Установив все в фиксированном положении, вы можете произвести вычисления, где на поверхности окажется каждая длина волны. Остается создать некоторую калибровочную карту, которая связывает пиксели с длиной волны, нужно кое-что сделать, но имея все в фиксированной настройке, это калибровка, которую вы должны выполнить только один раз. Еще одно преимущество: как только шкала будет написана на вашей поверхности, вы сможете легко документировать и проверять полученные данные.

person Daniel    schedule 18.02.2016
comment
Верно, но опять же нужно откалибровать призму. Это неприятная работа, поскольку большинство типов стекла имеют нелинейную дисперсию. Вот почему во всех коммерческих спектрометрах используются решетки. - person Carl Witthoft; 18.02.2016
comment
@CarlWitthoft: в самодельных спектроскопах также используются решетки, потому что их очень просто получить (с CD или DVD). Чтобы получить призму, обычно нужно рассечь какую-то оптическую систему. - person Spektre; 14.08.2018