Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
У меня есть набор фотографий, сделанных с определенным интервалом в течение суток (например каждые 5 минут, всего 288 фотографий).
Мне нужно сделать из них что-то вроде фотографии со сверхдлинной выдержкой, на которой неподвижные объекты будут отображены почти нормально, а движущиеся объекты будут малозаметны или незаметны. Для реализации я предполагаю взять изначально черный фон, а затем последовательно наложить на него все 288 фотографий серии, с прозрачностью примерно 0,3472% каждая. Но такая реализация будет генерировать очень большую вычислительную нагрузку на сервер.
Я бы хотел не накладывать все 288 фотографий каждый раз, а при каждой итерации накладывать только текущую фотографию. Чем-то нужное мне поведение похоже на вычисление скользящего среднего — будь это числа, я бы между вызовами просто суммировал бы значения рядов и считал количество рядов, а для получения среднего значения просто бы делил текущую сумму на текущее количество.
Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.
Как черновой вариант я попробую на каждой итерации «затемнять» итоговое изображение на 0,3472%, а затем накладывать на него текущее изображение с прозрачностью 0,3472%. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
Но может быть есть другие способы решения такой задачи?
28 окт 19, 23:45    [22004651]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
miksoft
Member

Откуда:
Сообщений: 37823
Alibek B.
Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.
Вполне можно применить. Можно увеличить разрядность целых чисел для каждого субпикселя или использовать тип с плавающей запятой.
Alibek B.
следы суточной давностью полностью сойдут на нет
Они не будут никак отличаться от следов полусуточной или получасовой давности.
Сходить на нет они будут если использовать взвешенное среднее с разными весами, чем старее картинка, тем ниже вес. Впрочем, нужно ли это в данной задаче - неизвестно, т.к. неизвестна сама задача.
28 окт 19, 23:53    [22004653]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
Если от 24х битного цвета (RGB 8:8:8) перейти к 48 битному то и скользящее среднее будет работать.
И точность будет абсолютная. Пикселы будут просто счетчиками. Головная картинка - прибавляет.
Хвосотвая - вычитает.
29 окт 19, 01:12    [22004673]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
Может я что-то не понял.
Если перейти на 48-битную глубину цвета, то разрядности хватит только на 256 сложений, на 288 уже не хватит.
А про использование float я не понял. Это в каком формате файлов такое возможно? Или речь о том, чтобы не использовать графические файлы, а сохранять значения пикселов в своем файле данных?
29 окт 19, 07:10    [22004702]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
Не хватит только если все картинки в выборке будут заполнены системным белым цветом к примеру. Причем в одной координате.
29 окт 19, 08:53    [22004726]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
То есть предлагается просто суммировать значения, то есть new = old+current, а не new = old + 256*i*current?
По-моему это неверно и будет искажать итоговое изображение, нарушать баланс цветов.
Но даже если так сделать, то переполнение будет событием высокой вероятности.
Во-первых это будет OSD (наложенные на кадр дата/время, обычно белого цвета).
Во-вторых, летом светлое время суток составляет почти 20 часов и в кадре будет много светлых областей, которые переполнят разрядность пиксела.
Ну и в третьих, это в принципе ограничивает применимость этого способа 5-минутным интервалом. Если я захочу делать фотографии каждую минуту (1440 фотографий), то 48-битная глубина цвета уже не поможет.

Пока что я пришел к тому, чтобы из текущего суммированного изображения вначале вычитать хвостовую картинку, а затем накладывать текущую. То есть в виде формулы это получится выражение: mix = mix - old/288 + new/288.
29 окт 19, 09:58    [22004775]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
Сделай буферную картинку с разрядностью канала 32 бита.

Все будет работать, чьорт тебя побери.
29 окт 19, 10:06    [22004787]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
32 бита на каждый компонент? То есть 128 бит на пиксел?
Я бы с радостью, если подскажите формат файла, который это предусматривает, и утилиту, которая с таким файлом может работать.
Сейчас я использую ImageMagick, 48-битный PNG он теоретически умеет.
29 окт 19, 11:52    [22004901]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
Напиши код!

Вообще. Друг. Ты в форуме Программирование. Это означает что здесь нет ничего невозможного.
Здесь есть просто незнание или лень.

По image-magic можно было сразу поднимать в Вопрос-Ответ или Unix.
29 окт 19, 11:59    [22004912]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Изопропил
Member

Откуда:
Сообщений: 31253
Alibek B.
подскажите формат файла

tiff

Alibek B.
и утилиту

Gimp
30 окт 19, 08:40    [22005669]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B.,

Достаточно мутно. Написал на бумажке, представляю вариант как понял сам начальный пост с затемнением. За ошибки прош. изв.

Имеем послед-сть вектор-функций, каждая от 2-х переменных
{f1(x,y) f2(x,y) f3(x,y) ... fn(x,y)} ,где n= 24*60/5=288, это наши рисунки.
Кол-во измерений вектора, к-рый является значением fi(x,y), ничего не меняет. Хоть 1, хоть (rgb), хоть (cmyk) ...
Задаём долю p=const (напр p= 1/n)
Для примера выполняем рекуррентное преобразование
Si= Si-1(x,y)*p + fi(x,y)*(1-p) для i= 1...n Не понял, зачем здесь нужно удвоение градации?

Неск первых итераций
+
i	Si
---	----
1	f1
2	f1*p + f2*(1-p)
3	f1*p^2*(1-p) + f2*p^1*(1-p) + f3*p^0*(1-p)
...	...
k	Sk= Sum(i=1..k,  fi*p^(k-i)*(1-p)^{i != 1} ),
или
k	Sk= f1*p^k + (1-p)*Sum(i=1..k,  fi*p^(k-i) ),
---	----

Что видим? видим взвешенную сумму f1...fk, только сумма весов ~1, но чуть меньше.
С небольшой натяжкой её можно назвать взвешенной.
Видим также, что чем свежее картинка, тем больший у неё вес в общей сумме.
Ретроспективное убывание весов почти экспоненциальное.
Для полной однородности формул можно взять S1= f1*(p-1).

Если нужна не вся серия, а т.ск. плавающее окно размером w, то заменить границы суммирования
например так Sk= Sum(i=k-w+1..k, .......) и p= 1/w, но усреднение всё равно экспоненциальное.
И эта формула не устойчива к выбросам (к т.н. движущимся точкам и титрам в терминологии ТСа), а про робастные веса, надо подумать, может и не имеют регулярной рекуррентной формы.
Из них мне помнится когда веса типа перевёрнутой параболы.
Но и вычисления тогда лучше производиь в double.


Да, конечно, сумма значений - это более устойчивый сглаживатель. Но нужно тогда брать ср.арифметич-е, дабы веса в сумме ==1.
30 окт 19, 22:40    [22006612]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
exp98
Видим также, что чем свежее картинка, тем больший у неё вес в общей сумме.

Э... Нет.
Если алгоритм объединения (преобразования) записать в виде формулы (где img0 это текущий скриншот, img1 предыдущий скриншот, img2 это скриншот 10 минут назад и т.д.), то нужный мне вариант выглядит так:
mix = (img0+img1+...+img287)/288
А процитированное соответствует формуле:
mix = mix/2 + img0/2
Вообще такое преобразование выглядит интересным и я позже хочу посмотреть, как оно выглядит вживую с реальными фотографиями (это должно быть что-то вроде фотографии, на которой проявляются следы недавних движений), но первоначально мне нужно другое, мне нужно получить усредненное за сутки изображение.
Указанная выше формула mix = (img0+img1+...+img287)/288 гарантированно его получает, но требует значительного объема вычислений на каждой итерации (на каждой итерации нужно выполнять 288 операций наложения).
Моя оптимизация заключается в том, чтобы использовать такую формулу:
mix = mix - img287/288 + img0/288
Математически это правильный алгоритм, причем экономный в плане вычислительной нагрузки — на каждой итерации выполняется только две операции наложения. Но поскольку в случае с изображениями используются целочисленные 8-разрядные вычисления, этот способ использовать напрямую нельзя, погрешности округлений сделают результат бесполезным.
Можно промежуточное изображение (mix) привести к 48-битной глубине цвета (по 16 бит на каждую компоненту, например в формате PNG48), тогда этот алгоритм можно будет использовать. Правда на каждой операции будет теряться 1-2 значащих бита, но думаю, что в итоговом изображении это будет незаметно. И кроме того точность этого способа будет сильно падать в увеличением количества изображений в серии (например для 1440 поминутных фотографий на каждой итерации будет теряться до 4-5 значащих битов).
Еще более правильным было бы использовать такую формулу:
mix' = mix' - img287 + img0
mix = mix'/288
Это был бы идеальный вариант, в котором значащие разряды не теряются, но тогда придется забыть про использование готовых инструментов/утилит. Чтобы использовать такой подход с изображениями. нужна минимум 72-битная глубина цвета (по 24 бита на каждую компоненту), а это возможно разве что в TIFF, причем не факт, что GD или ImageMagick с таким форматом сможет работать.

Но кроме таких "лобовых" алгоритмов мне подсказали довольно интересный альтернативный способ.
Для него я использую буфер промежуточных вычислений/изображений.
В виде формулы его можно записать как:

mix(0) = img1
mix(1) = img2+img3
mix(2) = img4+img5+img6+img7
...
То есть в буфере хранятся результаты попарных наложений изображений, а на каждой итерации они сдвигаются вниз по стеку и суммируются с предыдущими изображениями:

mix(0) = img0+img1
mix(N) = mix(N) + mix(N-1) + ... + mix(0)
Буфер на 10 элементов позволяет хранить до 1024 промежуточных изображений, из которых можно будет сформировать любое требуемое количество объединенных фотографий.
Этот способ не очень удобен в применении и его сложно оптимизировать, а кроме того количество операций наложения в худшем случае будет log2(288), но зато в нем нет погрешности вычислений и его можно применять с любым количеством изображений в серии.
30 окт 19, 23:38    [22006642]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B.,
Ты слишком много написал (а у меня сегодня что-то глаза резко просели ((, даже очки не помогают на обычном расстоянии), так я порассуждаю по частям, а местами независимо.
1)
автор
Э... Нет. Sk= Sum(i=1..k, fi*p^(k-i)*(1-p)^{i != 1} ),
У нас индексация противонапраправлена, так что всё в порядке i==k есть самый свежий кадр. И p очень мало, а не 1/2. На как сказано выше, эта регрессия не робастна.
2)
автор
Еще более правильным было бы использовать такую формулу:
mix' = mix' - img287 + img0
mix = mix'/288
Это был бы идеальный вариант,
Не очень ясно, скорее всего речь о ср.арифметическом. Пусть даже и в скользящем варианте. Идеально что?
31 окт 19, 14:16    [22007168]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B.,
3) Ты уж определись, что более важно и насколько.
Скорость вычислений, формат операндов, математ-кая корректность, или красота(вкл. исчезающую улыбку Чеширского кота) ?
Я не понимаю, что за мазохизм, когда жалеют железную машину (типа перетрудится, болезная) путём собственных извращений с градациями 128б, 513б, 2048б и т.д. Double обеспечит нужную красоту без мазохизма.

4) Насчёт ср.арифм-кого. Ну плавающее ср. оно и есть плавающее. Меня ночью Муза посетила в одном из нарядов от Закона больших чисел. И мне показалось, что ср.арифм будет давать эффект (на длинных последовательностях) в виде Гауссова размытия. Интересно убедиться в этом. (мож я и сам выберу время когда-нить)
31 окт 19, 14:27    [22007185]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
А есть обучающая выборка картинок? Для тренировки
31 окт 19, 14:32    [22007191]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B.,
5) Гауссово размытие может случиться, если в самом деле кадры будут достаточно "стационарны" в статистическом смысле (З-н Б-х Ч-л). Видеонаблюдение в помещении, камера неподвижна, освещение вкл-выкл не каждый час, достататочное разрешение камеры ...
Те же условия, похоже, нужны и для достижения той самой идеи о красоте суммы кадров.
31 окт 19, 14:33    [22007195]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
mayton, привинти смартфон к спинке стула на 1 час. Потом снимешь показания каждые 5 сек - вот тебе и выборка ... В качестве редклго движения иногда махни ладонью в его поле зрения.
31 окт 19, 14:36    [22007202]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B., ах да, блин!
6) Муза ещё что-то бормотала про скользящую медиану)) Правда с рекуррентностью тут ... видимо, для оптимизации придётся неск. буферных матриц хранить (пояление сэра Мэйтона напомнило).
31 окт 19, 14:39    [22007209]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
mayton
Member

Откуда: loopback
Сообщений: 42902
exp98
mayton, привинти смартфон к спинке стула на 1 час. Потом снимешь показания каждые 5 сек - вот тебе и выборка ... В качестве редклго движения иногда махни ладонью в его поле зрения.

Да я лучше возьму красивое цветное видео в FullHD. Потом утилиту типа ffmeg и получу набор картинок *.bmp.

P.S. Надеялся что участники топика заготовили тестовые данные. Но... не вышло... :(

Всегда так. С тестовыми данными. Мдя.
31 окт 19, 14:43    [22007215]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
exp98
Ты уж определись, что более важно и насколько.

Как обычно, нужен разумный баланс.
Обрабатываться будет на более-менее производительном сервере, так что даже если я буду тупо каждый раз обрабатывать все изображения, он наверное будет успевать это делать.
Но зачем вхолостую греть воздух, если можно оптимизировать процесс без ухудшения качества?

mayton
А есть обучающая выборка картинок? Для тренировки

Есть, если пережать в 720p, то примерно 30 МБ за сутки.
Если интересно, могу выложить минут через 20.
31 окт 19, 14:58    [22007246]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B.
...без ухудшения качества

автор
Double обеспечит нужную красоту без мазохизма.
, об этом ещё до меня написали ...
Возможно, правда, где-то что-то всё же придётся округлять вверх, чтобы совсем в 0 не встало.
31 окт 19, 15:14    [22007265]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Пробую материализовывать авторские мыслеформы далее.
Начальный пост (а...ё) содержит некоторые пожелания, что из этого оставляем?
+
а) ("красота")Мне нужно сделать из них что-то вроде фотографии со сверхдлинной выдержкой, на которой неподвижные объекты будут отображены почти нормально, а движущиеся объекты будут малозаметны или незаметны
б) ("птичку жалко")Но такая реализация будет генерировать очень большую вычислительную нагрузку на сервер.
в) ("рекуррентность") Я бы хотел не накладывать все 288 фотографий каждый раз, а при каждой итерации накладывать только текущую
г) ("скользящее среднее") Чем-то нужное мне поведение похоже на вычисление скользящего среднего
д) ("пикселов жалко") Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.
е) ("черновой вариант") "затемнять" итоговое изображение, а затем накладывать на него текущее изображение с прозрачностью. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
(Видимо, эту мыслеформу я уже материализовал формулой.)
ё) ("такая задача") может быть есть другие способы решения такой задачи?
Какова, всё же, задача,особенно учитывая последующее ср.арифметическое:
ж) ("полное ср.арифм") Пока что я пришел к тому, чтобы ...: mix = mix - old/288 + new/288.
(ИМХО, в этом варианте для общего случая равные веса не обеспечивают робастность, например к титрам)
31 окт 19, 15:16    [22007267]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
Alibek B., вот ещё забыл вариант от Музы:
вариант скользящего ср., взвеш. с "ядром Епанечникова". Полноценный робастный вариант.
В теории это ф-ция
y= 3/4(1-x^2) &&(x in [-1; 1])
Перевёрнутая парабола. Рекомендую, сам МНОГО раз пользовал.
Правда, чтобы сумма весов==1, надо бы поделить на 2, кажется.
Пример 7 весов(ну ... тут из экса взял, нужно округлить среднее число):
0,00000 0,12054 0,14286 0,15625 0,16071 0,15625 0,14286 0,12054 0,00000
31 окт 19, 15:29    [22007289]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
Alibek B.
Member

Откуда:
Сообщений: 3313
Нужно только A — усреднение всех изображений за сутки.
Ограничения реализации: обработка изображений будет выполняться bash+ImageMagick, поэтому реализация должна быть манипуляциями с изображениями (а не сохранение значений пикселов в CSV и работа с dword/float).
Пожелания: разумная оптимизация, чтобы не пересчитывать заново то, что можно не пересчитывать.

> е) ("черновой вариант") "затемнять" итоговое изображение, а затем накладывать на него текущее изображение с прозрачностью. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
Не совсем так.
Под затемнением и наложением я имел ввиду не blend с определенным коэффициентом прозрачности (тогда чем изображение свежее, тем у него будет больший вес), а арифметические операции вычитания и сложения над изображениями, умноженными на константу (тогда у всех изображений будет равный вес).
31 окт 19, 15:35    [22007296]     Ответить | Цитировать Сообщить модератору
 Re: Наложение серии изображений  [new]
exp98
Member

Откуда:
Сообщений: 1847
mayton
Надеялся что участники топика заготовили тестовые данные. Но... не вышло...
Принцип минимального действия в действии, www. halyave. net.
А вообще, яписал выше, что мне и самому интересно результаты увидеть воочию на разных моделях. Но неспеша. М.б.дней через 10-15(если ТС сам раньше не покажет рез-ты).
31 окт 19, 15:41    [22007304]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Программирование Ответить