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

Фон

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

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

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

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

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

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

Вопрос

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

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

Текущий статус

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

  1. сделайте снимок белого кусочка пластика и используйте это изображение для нормализации других значений
  2. Фиксированная диафрагма
  3. Фиксированная выдержка
  4. установить баланс белого с помощью белого листа бумаги
  5. Снимите все фотографии под одним углом
  6. Сделайте все фотографии в солнечный полдень

Ответы [ 3 ]

12 голосов
/ 17 марта 2011

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

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

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

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

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


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

Hue Plot - Green Purity in Hue Degrees
Рис. 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
}
3 голосов
/ 17 марта 2011

Глобальный проект ?

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

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

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

1 голос
/ 01 мая 2011
  1. Я бы предложил снимать «RAW» и конвертировать в 16-битный формат TIFF с использованием автоматического баланса белого камеры, но без коррекции гаммы (т. Е. С цветовым балансом, но с линейным выходом). 16-разрядный режим позволит лучше рассчитать коэффициенты и индексы в глубоких тенях и светлых участках (то есть без отсечения). DCRAW может сделать это, но ваша камера будет поставляться с собственным программным обеспечением, которое, вероятно, будет проще в использовании.

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

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

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

Веселитесь.

...