Как мне использовать мою зеркальную фотокамеру для измерения «зелени» фотографии?

13

Фон

Мои цифровые изображения могут быть считаны в компьютерную программу, такую ​​как Matlab или R, в виде матрицы amxnx 3, где mxn - это количество пикселей, наблюдаемых каждым из трех (красный, зеленый и синий) датчиков, и каждая ячейка в матрице имеет номер от 1-255, что отражает яркость, наблюдаемую датчиком.

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

Предыдущая работа в этом направлении имела определенный успех, рассчитав индекс зеленого как

  • зеленый% = зеленый / (синий + красный) или
  • зеленое расхождение = 2 * зеленый - красный - синий

из изображений веб-камеры для каждого из пикселей mxn, но не было никакого контроля над апертурой или падающим излучением (солнечный угол).

обратите внимание, что я не ищу «абсолютную» меру зелени, масштаб и распределение числа не имеют значения - он просто должен обеспечивать последовательную относительную меру зелени.

Вопрос

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

  • облачный покров?
  • время суток?
  • день года? (это единственное требование)
  • доля неба / земли на заднем плане?

Текущее состояние

Я выдвинул следующие идеи, но я не уверен, что было бы необходимо, или какие из них не повлияют на соотношение зеленый / (красный + синий)

  1. сделайте снимок белого кусочка пластика и используйте это изображение для нормализации других значений
  2. Исправить диафрагму
  3. Исправить выдержку
  4. установить баланс белого с помощью белого листа бумаги
  5. Возьмите все фотографии под одним углом
  6. Сделайте все фотографии в солнечный полдень
Дэвид Лебауэр
источник
1
Вы могли бы рассмотреть искусственное освещение, это сделало бы процедуру проще. Вспышка должна работать адекватно, просто убедитесь, что она находится в том же месте и по мощности.
PearsonArtPhoto
@Pearsonarphoto - интересная идея, я думал о фотографировании днем, но, возможно, имеет смысл делать их ночью без луны.
Дэвид Лебауэр
1
Если вы следуете совету Pearsonartphoto, вам нужно будет вручную установить выдержку, диафрагму и ISO - установите выдержку затвора на скорость синхронизации вашей вспышки (обычно от 1/200 до 1/320) и установите низкую величину диафрагмы и ISO как они могут идти без исчерпания мощности вспышки. Это сделает ваше окружение настолько темным, насколько это возможно - полная луна не должна быть проблемой (солнце в полдень, с другой стороны ...). В этой ситуации лучше будет использовать осевую вспышку, поскольку она будет отбрасывать наименьшее количество теней. ,
Эван Кралл
2
@ Иван Я не согласен с осевой вспышкой. Причина такова : photo.stackexchange.com/questions/9531/… —Слишком много прямого отражения. За исключением случаев использования поляризаторов, как я описал там, - но затем необходимо убедиться, что передача остается неизменной, а баланс белого выполняется правильно. Поляризаторы меняют баланс белого.
Саймон А. Эугстер
2
Хлорофилл является наиболее ярким в ближней инфракрасной области: yale.edu/ceo/Documentation/rsvegfaq.html Существуют стандартные меры «зелености» растений, основанные на этом, такие как NDVI. Таким образом, если вы можете, получите камеру, которая может записывать диапазон NIR.
whuber

Ответы:

12

Если вы сможете обрабатывать файлы RAW, у вас будет массив пикселей Байера, состоящий из строк RGRGRG и GBGBGB (или, возможно, строк RGBGRGBG). Вы можете игнорировать все пиксели R и B, суммировать пиксели G, взять квадратный корень ( поскольку зеленых пикселей в два раза больше, чем красного или синего), разделите их на половину числа G пикселей. Это должно дать вам правильное средневзвешенное значение для «зеленого» на вашей фотографии. Затем вы можете взять среднее значение красного и синего и вычислить ваш зеленый процент из всех трех средних.

Чтобы быть более точным, вы, возможно, захотите учесть правильное взвешивание для красного, зеленого и синего пикселей датчика, поскольку датчики CMOS имеют различную чувствительность к каждой длине волны света. Вес будет зависеть от датчика, как правило. Это был бы простой подход.

Чтобы учесть цветовой оттенок, обусловленный временем суток, различными типами искусственного освещения и т. Д., Может быть более целесообразным предварительно обработать каждую фотографию в таком инструменте, как Lightroom, чтобы сначала исправить баланс белого, а затем выполнить вычисления на стандартных пиксельных изображениях RGB. В отличие от обработки данных датчика RAW, вам нужно взвесить ваши расчеты на основе «зеленой чистоты» пикселя, а не усреднить зеленый компонент в целом. Чем более чистый зеленый пиксель, тем больше его вес по сравнению с пикселями, которые являются более красными или синими. Нормализация баланса белого перед обработкой должна исключить необходимость усложнять иным образом довольно простые вычисления с касательными, разработанными для учета множества факторов, таких как облачный покров, время суток, время года и т. Д.

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

Что касается вашей процедуры, то само собой разумеется, что если вы сделаете снимки с одинаковыми настройками камеры при одном и том же источнике света (с одинаковой интенсивностью и цветовой температурой), измеренном по общей базовой линии, такой как 18% серая карта, очевидно, долгий путь к нормализации ваших результатов. В цифровом формате любые расхождения можно исправить с помощью программного обеспечения для обработки RAW и базового инструмента выбора баланса белого, поэтому обязательно снимайте в формате RAW.


Чтобы получить более глубокое представление о расчете "зелености" ваших фотографий. Очевидно, есть простые способы, такие как вычисление веса пикселей зеленого байера по сравнению с синим и красным или вычисление зеленой чистоты по отношению к красной / синей чистоте пикселей RGB. Вам может повезти больше, если вы преобразуете в более подходящее цветовое пространство, такое как HSV ( Hue / Saturation / Value , иногда называемое HSB, заменяя Value на Brightness), и вычисляете количество зеленого, используя кривую в пространстве HUE. (ПРИМЕЧАНИЕ: HSL - это другой тип цветового пространства, и, вероятно, он не был бы идеальным для вычисления количества «зеленого» на фотографии, поэтому я бы использовал HSV. Подробнее об этих цветовых пространствах можно узнать здесь..) Чистый зеленый (независимо от насыщенности или значения) падает под углом 120 ° и падает оттуда, когда вы двигаетесь в направлении красного (при 0 °) или в сторону синего (при 240 °). Между 240 ° и 360 ° в пикселе будет нулевое количество зеленого цвета, независимо от насыщенности или значения.

Hue Plot - Зеленая чистота в градусах Хюэ
Рис. 1. График оттенков - зеленая чистота в градусах оттенков.

Вы можете настроить фактическую весовую кривую в соответствии с вашими конкретными потребностями, однако простая кривая может быть похожа на следующую:

range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)

Значение для pureGreenдолжно быть 1,0 . Формула для вычисления greennessможет тогда быть сделана следующим образом:

             sin(scale * hue)   } 0 > hue > 240
greenness = 
             0                  } 240 <= hue <= 360 || hue == 0

hueЯвляется степень цвета от вашего цветового значения HSV. Это radiusполовина, periodв которой зеленый присутствует в некоторой степени. В scaleподстраивается грех кривой на наш период, таким образом, что sin(scale * hue)пики (возвращает 1,0) , где именно вы имели бы чистый зеленый ( с игнорированием , что интенсивность зелень). Поскольку величина greennessдействительна только в первой половине нашего периода, расчет зелени действителен только тогда, когда оттенок больше 0 ° и меньше 240 °, а его ноль - для любого другого оттенка.

Вы можете отрегулировать взвешивание, отрегулировав период, диапазон, в пределах которого вы можете определить диапазон green(т. Е. Вместо 0 до 240, вы могли бы установить ограничение как 40 > hue > 200вместо этого), и определить что-либо за пределами этого диапазона, чтобы иметь зеленость 0 Следует отметить, что это будет математически точно, однако оно может быть не совсем воспринимаемым. Вы можете, конечно, настроить формулу, чтобы настроить точку pure greenбольше в сторону желтого (что может дать более точные для восприятия результаты), увеличить амплитуду кривой до плато и расширить полосу чистого зеленого до диапазона оттенка, а не одного значение оттенка и т. д. Для полной точности восприятия человека более сложный алгоритм обрабатывается в CIE XYZ и CIE L a b *пространство может потребоваться. (ПРИМЕЧАНИЕ. Сложность работы в пространствах XYZ и Lab значительно возрастает по сравнению с тем, что я здесь описал.)

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

Вы можете найти алгоритмы для преобразования цвета в EasyRGB , например, для RGB в HSV:

var_R = ( R / 255 )                     // Red percentage
var_G = ( G / 255 )                     // Green percentage
var_B = ( B / 255 )                     // Blue percentage

var_Min = min( var_R, var_G, var_B )    //Min. value of RGB
var_Max = max( var_R, var_G, var_B )    //Max. value of RGB
del_Max = var_Max - var_Min             //Delta RGB value 

V = var_Max                             //Value (or Brightness)

if ( del_Max == 0 )                     //This is a gray, no chroma...
{
   H = 0                                //Hue (0 - 1.0 means 0° - 360°)
   S = 0                                //Saturation
}
else                                    //Chromatic data...
{
   S = del_Max / var_Max

   del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

   if      ( var_R == var_Max ) H = del_B - del_G
   else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
   else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

   if ( H < 0 ) H += 1
   if ( H > 1 ) H -= 1
}
Йриста
источник
1
+1 к технике сырой обработки. Исходник dcraw был бы хорошей отправной точкой cybercom.net/~dcoffin/dcraw/dcraw.c
Пожалуйста, прочитайте профиль
1
Необработанная обработка упростит расчет уровня зеленого, однако значительно усложнит работу с цветовыми оттенками.
rista
3

Проект ГЛОУБ ?

Не используйте белый лист бумаги. Они содержат оптические отбеливатели, которые преобразуют часть ультрафиолета в синий свет, вызывая неправильную экспозицию. Вот почему существуют коммерческие серые карты (как полагает Джриста).

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

Что касается разницы между затуманенным и не затуманенным, вы можете просто запустить несколько тестов. Если истинное количество зеленого не меняется быстро (то есть с сегодняшнего дня до завтра), то это не должно происходить при изучении изображений. Возможно, в этом поможет эмпирический подход (например, если вы обнаружите, что зеленость всегда на 10% выше, когда она затуманена, вы можете это компенсировать).

Саймон А. Эугстер
источник
это не проект GLOBE, но его можно превратить в один; спасибо за указание на этот сайт.
Дэвид Лебауэр
Возможно, вас это тоже заинтересует: в настоящее время я пишу программу для анализа видео, например, с веб-камер, и вывода статистики (зеленый ресурс и т. Д.). Должно быть закончено в ближайшие недели. phenocam.granjow.net
Саймон А. Эугстер
это звучит полезно. Сотрудничали ли вы с учеными?
Дэвид Лебауэр
Пока не так уж много, так как методы оценки будут последней частью (а также могут быть легко изменены / добавлены). Но это проект от ETH Zürich и также будет использоваться там. (Чтобы быть точным, первоначально это будет использоваться учащимися старших классов для их проекта Globe.)
Саймон Эугстер
1
  1. Я бы посоветовал снимать «RAW» и конвертировать в 16-битный формат TIFF, используя автоматический баланс белого камеры, но без коррекции гаммы (т. Е. С цветовым балансом, но с линейным выходом). 16-разрядный режим позволит лучше рассчитать коэффициенты и индексы в глубоких тенях и светлых участках (т.е. без ограничения). DCRAW может сделать это, но ваша камера будет поставляться с собственным программным обеспечением, которое, вероятно, проще в использовании.

  2. Если вам нужны индексы, тогда RGB - действительно единственное полезное цветовое пространство. Вы уже упоминали индекс «зеленой дивергенции» (также называемый «избыток зеленого индекса») - этот алгоритм и тесно связанный с ним алгоритм «зеленых листьев» работают очень хорошо. Если вы хотите выполнить классификацию пикселей на основе цвета (то есть, вегетарианство или не-вегетарианство), я бы внимательно посмотрел на цветовое пространство L a b *, а не на HSV / HSI. Существует на самом деле очень хороший демо на сайте Mathworks , которая иллюстрирует L Aб * анализ. Классификацию можно было бы объединить со спектральным анализом, чтобы ответить на вопросы: а) сколько зеленых пикселей и б) насколько они зеленые? Это может быть более полезным, чем просто индекс зелености, на который также будет влиять фоновое спектральное качество (почва, мусор и т. Д.), Которое также может со временем меняться. Вы упомянули урожай кукурузы, поэтому я предполагаю, что вы направили камеру вниз, а не вверх?

  3. Если бы у вас было две камеры, то вы могли бы комбинировать нисходящие изображения (измерение зелености) с восходящими изображениями, которые измеряют растительный покров. Восходящие изображения не будут подходить для спектрального анализа, а классификация пикселей будет основываться на контрасте между небом и небом, возможно, с использованием только синего канала изображения RGB.

  4. Если вы собираете (ежедневные?) Временные ряды, то вы можете разделить нисходящие изображения на изображения «облачного дня» и изображения «солнечного дня» и проверить наличие смещения. Вы можете поиграть с цветовым балансом во время необработанной обработки, чтобы исправить смещение, если оно есть, или просто изменить масштаб одной серии, чтобы она соответствовала другой (сделайте это проще), предполагая, что солнечные и облачные дни чередуются.

Веселиться.

Рыбий
источник
Цветная плитка с красной, зеленой и синей плитками может быть даже лучше, чем серая карта, если вы идете по этому пути.
рыбий глаз