Вы должны получить 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
...
вычислить интенсивность из RGB
это может быть немного сложно, так как ваш датчик может иметь разную чувствительность для разных длин волн. Вы можете нормализовать интенсивность аналогично №1. Просто сделайте снимок источника света известной интенсивности и приблизьте недостающие длины волн. Также это можно сделать с помощью солнечного света в качестве источника.
Из нормализованного цвета вы просто вычисляете интенсивность серой шкалы, и все.
Для повышения точности вы можете усреднить все пиксели для одного и того же x
.
Также для повышения точности и чувствительности обычно используется не цветной датчик (в основном линейные камеры) либо по дизайну, либо путем удаления Фильтр Байера, чтобы не испортить данные.