Автоматическая идентификация счастливых изображений для пейзажной фотографии - Фотопедия
3 голосов
/ 24 октября 2017

Я недавно сделал пробный прогон для проекта, чтобы сфотографировать определенную область скалолазания с разных направлений. Я делал снимки в одно и то же время в разные времена дня, пробовал разные экспозиции и сделал 16 снимков для установок, которые казались лучшими. Лучший выстрел из лучшего сеанса был этот (уменьшенное изображение ниже). Первоначально я думал, что попробую составлять изображения, но результат объединения 16 снимков выглядел хуже (меньше деталей), чем лучший отдельный снимок. Атмосферная турбулентность была отчетливо видна через линзу, когда жаркое полуденное солнце коснулось западной части скалы. Хотя утром я получил несколько снимков непрямым светом, на самом деле они показали меньше деталей из-за отсутствия теней и контраста, а также из-за более низкого уровня освещенности. Там нет места, откуда я мог бы получить правильную перспективу моего объекта поблизости, поэтому все мои снимки придется снимать с объектива 135 или 300 мм издалека.

Tahquitz rock

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

Или я мог бы получить лучшие результаты, используя технику видео? Впечатляющие результаты описаны здесь . Но похоже, что для этого нужно уметь снимать со скоростью 10 кадров в секунду, и я не понял, сможет ли моя камера это сделать. (У меня есть Fuji x-e1.)

[РЕДАКТИРОВАТЬ] Посмотрев немного в Интернете, я думаю, что у меня есть некоторые частичные ответы на мой собственный вопрос. (1) Астрономы-любители, использующие счастливое изображение, похоже, используют Windows и распространяют «условно-бесплатное» программное обеспечение Windows. (2) AFAICT астрономические методы включают все выбирая «ссылочный звезда», который, как предполагается, является точечным источником. Если у вас есть такая эталонная звезда, то измерить качество изображения довольно просто. Обычные один, кажется, Штреля, который является в основном пиком интенсивности изображения вашей опорной звезды. Поэтому, если эти впечатления верны, для меня, возможно, имеет смысл попробовать применить собственный алгоритм выбора изображений для ландшафтов.

Ответы [ 3 ]

6 голосов
/ 26 октября 2017

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

Я реализовал идею использования RMS Laplacian. Идея состоит в том, что если яркость изображения представлена ​​массивом пикселей a [i, j], то в любой точке (i, j) мы имеем дискретное приближение к лапласиану L = a [i-1, J] + а [I + 1, J] + а [I, J-1] + а [I, J + 1] -4a [I, J]. Это измеряет четкость изображения. Например, если изображение не в фокусе, L будет ниже. Среднеквадратичное значение лапласиана, R, является квадратным корнем из среднего квадрата лапласиана.

Вот мой код, который вычисляет R для входного PNG-изображения:

#!/usr/bin/ruby

# To batch convert a bunch of JPGs to png:
# perl -e '$i=0; foreach $f(<*.JPG>) {$s=sprintf("%03d",$i); $c="convert $f $s.png"; print "$c\n"; system($c); $i=$i+1;}'

require 'oily_png'

# require 'hsluv'
  # http://www.hsluv.org
  # https://github.com/hsluv/hsluv-ruby
  # sudo gem install hsluv

# Sloppy and probably not physiologically valid, but fast.
# Returns an integer from 0 to 255*3.
def color_to_brightness(c)
  return ChunkyPNG::Color::r(c)+ChunkyPNG::Color::g(c)+ChunkyPNG::Color::b(c)
end


def rms_laplacian_from_file(input_file)
  image = ChunkyPNG::Image.from_file(input_file)
  n = 0
  sum = 0
  sum_sq = 0
  w = image.width
  h = image.height
  1.upto(w-2) { |i|
    ### if i%1000==0 then print "i=#{i}\n" end # show progress
    next unless i>w/3 && i<(2*w)/3 ## for efficiency, only use center of frame
    1.upto(h-2) { |j|
      next unless j>h/3 && j<(2*h)/3 ## for efficiency, only use center of frame
      next unless rand(10)==0 # for efficiency
      a = Hash.new
      (-1).upto(1) { |k|
        (-1).upto(1) { |l|
          c = image[i+k,j+l] # color, represented as a 4-byte rgba value
          a[[k,l]] = color_to_brightness(c)
        }
      }
      laplacian = a[[1,0]]+a[[-1,0]]+a[[0,1]]+a[[0,-1]]-4*a[[0,0]]
      n = n+1
      sum = sum + laplacian
      sum_sq = sum_sq + laplacian*laplacian
    }
  }
  sum = sum.to_f/n
  sum_sq = sum_sq.to_f/n
  rms = Math::sqrt(sum_sq-sum*sum)
  return rms
end

ARGV.each { |input_file|
  rms = rms_laplacian_from_file(input_file)
  print "#{input_file} -- rms=#{rms}\n"
}

Это реализовано в Ruby и работает в Linux с использованием библиотеки oily_png с открытым исходным кодом. Если кто-то заинтересован в том, чтобы попробовать его, он должен почти не требовать изменений для запуска на других платформах, если у вас установлены Ruby и oily_png.

Чтобы проверить, что он измеряет резкость, я взял первое изображение из моего набора из 16, измерил R, а затем добавил 5-пиксельное размытие по Гауссу, используя GIMP, и заново измерил R. Результат был R = 30,8 до размытия и R = 7,8 после. Так что это, кажется, подтверждает, что он измеряет резкость.

Мои 16 изображений пронумерованы от 000 до 015. Глядя на изображения на глаз, я ранее выбрал изображение 003 как лучшее. Это было изображение, на которое я разместил ссылку в вопросе.

Я запустил свой код на 16 снятых снимках и получил следующий вывод:

000.png -- rms=30.809465960392004
001.png -- rms=31.215359700578606
002.png -- rms=31.909926250066476
003.png -- rms=31.83243374839454
004.png -- rms=31.310612756003305
005.png -- rms=30.353258897447564
006.png -- rms=30.61244684985801
007.png -- rms=30.882745734215135
008.png -- rms=28.667104210689384
009.png -- rms=29.862966602367973
010.png -- rms=29.72001987743495
011.png -- rms=30.51274847773823
012.png -- rms=30.84316910530572
013.png -- rms=29.21751498027252
014.png -- rms=29.067434969521976
015.png -- rms=30.831305018709617

Из 16 изображений мой выбор имел второе по величине значение R. Казалось бы, это подтверждает, что эта статистика может быть полезна в качестве альтернативы проверке изображений и субъективной оценке их на глаз.

Моя реализация довольно медленная, и чтобы восполнить это, я сделал несколько вещей, чтобы улучшить ее производительность. Я проверяю только середину поля и пробую лапласиан только в 1/10 точек. В более оптимизированной реализации эти ярлыки могут быть устранены при желании.

Позже мне пришло в голову, что может быть гораздо более простой способ сделать это. Изображение с большим количеством деталей также не должно сжиматься, поэтому самый большой файл JPG может быть просто лучшим. Конечно, выполнение команды ls -lS для вывода списка файлов в порядке уменьшения размера дает список, который был почти в том же порядке, что и файлы, отсортированные по убыванию R:

-rw-rw-r-- 1 bcrowell bcrowell 16970354 Oct 25 15:48 003.png
-rw-rw-r-- 1 bcrowell bcrowell 16927174 Oct 25 15:48 002.png
-rw-rw-r-- 1 bcrowell bcrowell 16903104 Oct 25 15:48 004.png
-rw-rw-r-- 1 bcrowell bcrowell 16882373 Oct 25 15:47 000.png
-rw-rw-r-- 1 bcrowell bcrowell 16861082 Oct 25 15:47 001.png
-rw-rw-r-- 1 bcrowell bcrowell 16817527 Oct 25 15:48 006.png
-rw-rw-r-- 1 bcrowell bcrowell 16816529 Oct 25 15:49 011.png
-rw-rw-r-- 1 bcrowell bcrowell 16793982 Oct 25 15:49 012.png
-rw-rw-r-- 1 bcrowell bcrowell 16786443 Oct 25 15:48 009.png
-rw-rw-r-- 1 bcrowell bcrowell 16773575 Oct 25 15:48 005.png
-rw-rw-r-- 1 bcrowell bcrowell 16771759 Oct 25 15:49 010.png
-rw-rw-r-- 1 bcrowell bcrowell 16765674 Oct 25 15:48 007.png
-rw-rw-r-- 1 bcrowell bcrowell 16764562 Oct 25 15:49 015.png
-rw-rw-r-- 1 bcrowell bcrowell 16750179 Oct 25 15:48 008.png
-rw-rw-r-- 1 bcrowell bcrowell 16732854 Oct 25 15:49 013.png
-rw-rw-r-- 1 bcrowell bcrowell 16684073 Oct 25 15:49 014.png
3 голосов
/ 26 октября 2017

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

Насколько я понимаю, ваше определение "счастливого образа" является более резким, чем в среднем. Поскольку многие камеры используют измерение резкости (области) изображения в своих механизмах автофокусировки 1 , ясно, что существует какой-то способ автоматизировать его измерение. Однако преимущества разных подходов и возможность их сочетания являются предметом активного исследования, поэтому нельзя ожидать однозначного ответа. Например. Надежный алгоритм автоматической фокусировки для изображений с низкой контрастностью Используя новую меру контрастности , Jinshan Tang et. al., Sensors (2011) говорит, что

Многие контрастные меры были использованы для пассивной автофокусировки ... Результаты показывают, что 2D пространственные методы измерения, такие как Tenengrad, Prewitt Edge обнаружение, а лапласианство дает лучшую производительность с точки зрения точности и унимодальности. Однако они очень чувствительны к шуму и не устойчивы к различным условиям сцены, таким как условия низкой освещенности.

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

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


1 Точнее, те, которые используют автофокусировку с обнаружением контраста, а не автофокусировку с фазовым детектированием. И да, я знаю, что зеркальные фотокамеры с live view используют PDAF с опущенным зеркалом и CDAF в live view.

0 голосов
/ 01 ноября 2017

Это, вероятно, слишком далеко, чтобы представлять большой интерес, но: лапласиан в одном измерении увеличивает высокочастотное содержимое, умножая спектр Фурье на квадрат частоты. (Надеюсь, я понял это правильно.) Так что это усиливает как шум, так и сигнал. Может быть интересно посмотреть, сможет ли детектор краев выделить интересующие вас особенности. Учитывая конкретный детектор края, возможно, будет интересна фотография с самой длинной общей длиной края. Это может быть просто погоня за хвостом, а может и нет?

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...