Недавно я сделал пробный запуск проекта, чтобы сфотографировать определенную область скалолазания с разных направлений. Я сделал несколько снимков в разное время дня с одного и того же места, попробовал разные экспозиции и сделал 16 снимков с настройками, которые показались мне лучшими. Лучший кадр из лучшей сессии был этот(миниатюра ниже). Первоначально я думал, что попробую сложить изображения, но результат сложения 16 снимков выглядел хуже (меньше деталей), чем лучший отдельный снимок. Атмосферная турбулентность была хорошо видна через линзу, когда жаркое послеполуденное солнце падало на западную сторону скалы. Хотя я сделал несколько снимков утром с непрямым освещением, на них было меньше деталей из-за отсутствия теней и контраста, а также более низкого уровня освещенности. У меня нет места, откуда я мог бы получить правильный ракурс на свой объект с близкого расстояния, поэтому все мои изображения должны быть сняты с объективом 135 мм или 300 мм издалека.
Есть ли способ автоматизировать процесс поиска удачных изображений из набора таких пейзажных фотографий? Поскольку люди, делающие удачные снимки с астрономической фотографией, иногда делают сотни снимков, я предполагаю, что они каким-то образом автоматизируют это, но я не знаю, подходят ли алгоритмы, которые они используют, для пейзажной фотографии. Этот проект будет включать в себя много поездок и пеших прогулок, поэтому я был бы рад сделать сотни снимков подряд, если это может быть полезно. Я ищу решение с открытым исходным кодом, которое работает в Linux, желательно что-то, что я могу сделать из командной строки.
Или я, вероятно, получу лучшие результаты, используя видеотехнику? Впечатляющие результаты описаны здесь . Но вроде как для этого нужно уметь снимать около 10 кадров в секунду, а я так и не понял, сможет ли это сделать моя камера. (У меня Fuji x-e1.)
[РЕДАКТИРОВАТЬ] Немного покопавшись в Интернете, я думаю, что у меня есть некоторые частичные ответы на мой собственный вопрос. (1) Астрономы-любители, использующие удачные изображения, похоже, используют Windows и распространяют условно-бесплатное программное обеспечение Windows. (2) УВЕРЕН, что все астрономические методы включают в себя выбор «опорной звезды», которая считается точечным источником. Если у вас есть эталонная звезда, то довольно просто получить меру качества изображения. Распространенным является коэффициент Штреля, который представляет собой пиковую интенсивность изображения вашей эталонной звезды. Так что если эти впечатления верны, то мне может быть имеет смысл попробовать накатить собственный алгоритм выбора изображений для пейзажей.
Это не окончательный ответ на мой собственный вопрос, но он слишком длинный для комментария.
Я реализовал идею использования лапласиана RMS. Идея состоит в том, что если яркость изображения представлена массивом пикселей a[i,j], то в любой точке (i,j) мы имеем дискретное приближение к лапласиану L=a[i-1, j]+a[i+1,j]+a[i,j-1]+a[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
Есть ли способ автоматизировать процесс поиска удачных изображений из набора таких пейзажных фотографий?
Насколько я понимаю, ваше определение «счастливого изображения» — это изображение, которое четче среднего. Поскольку многие камеры используют измерение резкости (области) изображения в своих механизмах автофокусировки 1 , ясно, что есть способ автоматизировать его измерение. Однако преимущества разных подходов и возможности их комбинирования являются предметом активных исследований, поэтому однозначного ответа ждать не приходится. Например , надежный алгоритм автоматической фокусировки для низкоконтрастных изображений с использованием новой меры контрастности , Jinshan Tang et. al., Sensors (2011) говорит, что
Многие меры контраста использовались для пассивной AF ... Результаты показывают, что методы 2D пространственных измерений, такие как Tenengrad, обнаружение Prewitt Edge и лапласиан, дают наилучшие результаты с точки зрения точности и одномодальности. Однако они очень чувствительны к шуму и неустойчивы к различным условиям сцены, таким как условия низкой освещенности.
Напротив, методы, основанные на дисперсии, являются быстрыми и надежными. Основная идея заключается в вычислении дисперсии интенсивности изображения. Изображение лучше всего сфокусировано, когда дисперсия достигает максимума. Типичным методом в области дискретного косинусного преобразования (DCT) является вычисление коэффициентов переменного тока изображений, которые также можно использовать для представления информации о функции дисперсии яркости.
Поскольку вы не ограничены производительностью в реальном времени на маломощном процессоре в камере, вы, вероятно, могли бы реализовать несколько подходов и попытаться объединить их оценки. Вы говорите о стеке, поэтому я предполагаю, что у вас есть несколько снимков, сделанных с одного и того же места и примерно в одинаковых условиях освещения: возможно, стоит подумать о стеке, а не о стеке, чтобы вы выбрали фотографию, которая имеет лучший контраст в одной области, и фотографию, которая имеет лучший контраст в другой, и склеить их вместе. Я не уверен, в какой степени существующее программное обеспечение для шитья поддерживает этот вид стежка с выделением контраста.
1 Точнее, те, которые используют автофокусировку с определением контраста, а не автофокусировку с определением фазы. И да, я знаю, что зеркалки с просмотром в реальном времени используют PDAF с зеркалом вниз и CDAF в режиме просмотра в реальном времени.
Это, вероятно, слишком далеко, чтобы представлять большой интерес, но: лапласиан в одном измерении увеличивает содержание высоких частот, умножая спектр Фурье на квадрат частоты. (Надеюсь, я правильно понял.) Таким образом, он усиливает и шум, и сигнал. Было бы интересно посмотреть, сможет ли детектор краев выделить интересующие особенности. Учитывая конкретный детектор краев, возможно, будет интересна фотография с наибольшей общей длиной края. Это может быть просто погоня за хвостом, а может и нет?
Твальберг
пользователь 21068
Твальберг
пользователь 21068
пользователь 21068
Скоттбб
Майкл С
пользователь 21068
Майкл С
Майк Диксон
пользователь 21068
Майк Диксон
пользователь50888
Скоттбб
Скоттбб