Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наложение серии изображений / 25 сообщений из 166, страница 1 из 7
28.10.2019, 23:45
    #39882505
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
У меня есть набор фотографий, сделанных с определенным интервалом в течение суток (например каждые 5 минут, всего 288 фотографий).
Мне нужно сделать из них что-то вроде фотографии со сверхдлинной выдержкой, на которой неподвижные объекты будут отображены почти нормально, а движущиеся объекты будут малозаметны или незаметны. Для реализации я предполагаю взять изначально черный фон, а затем последовательно наложить на него все 288 фотографий серии, с прозрачностью примерно 0,3472% каждая. Но такая реализация будет генерировать очень большую вычислительную нагрузку на сервер.
Я бы хотел не накладывать все 288 фотографий каждый раз, а при каждой итерации накладывать только текущую фотографию. Чем-то нужное мне поведение похоже на вычисление скользящего среднего — будь это числа, я бы между вызовами просто суммировал бы значения рядов и считал количество рядов, а для получения среднего значения просто бы делил текущую сумму на текущее количество.
Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.
Как черновой вариант я попробую на каждой итерации «затемнять» итоговое изображение на 0,3472%, а затем накладывать на него текущее изображение с прозрачностью 0,3472%. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
Но может быть есть другие способы решения такой задачи?
...
Рейтинг: 0 / 0
28.10.2019, 23:53
    #39882507
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B.Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.Вполне можно применить. Можно увеличить разрядность целых чисел для каждого субпикселя или использовать тип с плавающей запятой.
Alibek B.следы суточной давностью полностью сойдут на нетОни не будут никак отличаться от следов полусуточной или получасовой давности.
Сходить на нет они будут если использовать взвешенное среднее с разными весами, чем старее картинка, тем ниже вес. Впрочем, нужно ли это в данной задаче - неизвестно, т.к. неизвестна сама задача.
...
Рейтинг: 0 / 0
29.10.2019, 01:12
    #39882520
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Если от 24х битного цвета (RGB 8:8:8) перейти к 48 битному то и скользящее среднее будет работать.
И точность будет абсолютная. Пикселы будут просто счетчиками. Головная картинка - прибавляет.
Хвосотвая - вычитает.
...
Рейтинг: 0 / 0
29.10.2019, 07:10
    #39882538
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Может я что-то не понял.
Если перейти на 48-битную глубину цвета, то разрядности хватит только на 256 сложений, на 288 уже не хватит.
А про использование float я не понял. Это в каком формате файлов такое возможно? Или речь о том, чтобы не использовать графические файлы, а сохранять значения пикселов в своем файле данных?
...
Рейтинг: 0 / 0
29.10.2019, 08:53
    #39882546
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Не хватит только если все картинки в выборке будут заполнены системным белым цветом к примеру. Причем в одной координате.
...
Рейтинг: 0 / 0
29.10.2019, 09:58
    #39882573
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
То есть предлагается просто суммировать значения, то есть new = old+current, а не new = old + 256*i*current?
По-моему это неверно и будет искажать итоговое изображение, нарушать баланс цветов.
Но даже если так сделать, то переполнение будет событием высокой вероятности.
Во-первых это будет OSD (наложенные на кадр дата/время, обычно белого цвета).
Во-вторых, летом светлое время суток составляет почти 20 часов и в кадре будет много светлых областей, которые переполнят разрядность пиксела.
Ну и в третьих, это в принципе ограничивает применимость этого способа 5-минутным интервалом. Если я захочу делать фотографии каждую минуту (1440 фотографий), то 48-битная глубина цвета уже не поможет.

Пока что я пришел к тому, чтобы из текущего суммированного изображения вначале вычитать хвостовую картинку, а затем накладывать текущую. То есть в виде формулы это получится выражение: mix = mix - old/288 + new/288.
...
Рейтинг: 0 / 0
29.10.2019, 10:06
    #39882580
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Сделай буферную картинку с разрядностью канала 32 бита.

Все будет работать, чьорт тебя побери.
...
Рейтинг: 0 / 0
29.10.2019, 11:52
    #39882639
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
32 бита на каждый компонент? То есть 128 бит на пиксел?
Я бы с радостью, если подскажите формат файла, который это предусматривает, и утилиту, которая с таким файлом может работать.
Сейчас я использую ImageMagick, 48-битный PNG он теоретически умеет.
...
Рейтинг: 0 / 0
29.10.2019, 11:59
    #39882645
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Напиши код!

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

По image-magic можно было сразу поднимать в Вопрос-Ответ или Unix.
...
Рейтинг: 0 / 0
30.10.2019, 08:40
    #39882943
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B.подскажите формат файла
tiff

Alibek B.и утилиту
Gimp
...
Рейтинг: 0 / 0
30.10.2019, 22:40
    #39883361
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
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 Не понял, зачем здесь нужно удвоение градации?

Неск первых итераций
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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.
...
Рейтинг: 0 / 0
30.10.2019, 23:38
    #39883368
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
exp98Видим также, что чем свежее картинка, тем больший у неё вес в общей сумме.
Э... Нет.
Если алгоритм объединения (преобразования) записать в виде формулы (где img0 это текущий скриншот, img1 предыдущий скриншот, img2 это скриншот 10 минут назад и т.д.), то нужный мне вариант выглядит так:
Код: plaintext
mix = (img0+img1+...+img287)/288
А процитированное соответствует формуле:
Код: plaintext
mix = mix/2 + img0/2
Вообще такое преобразование выглядит интересным и я позже хочу посмотреть, как оно выглядит вживую с реальными фотографиями (это должно быть что-то вроде фотографии, на которой проявляются следы недавних движений), но первоначально мне нужно другое, мне нужно получить усредненное за сутки изображение.
Указанная выше формула mix = (img0+img1+...+img287)/288 гарантированно его получает, но требует значительного объема вычислений на каждой итерации (на каждой итерации нужно выполнять 288 операций наложения).
Моя оптимизация заключается в том, чтобы использовать такую формулу:
Код: plaintext
mix = mix - img287/288 + img0/288
Математически это правильный алгоритм, причем экономный в плане вычислительной нагрузки — на каждой итерации выполняется только две операции наложения. Но поскольку в случае с изображениями используются целочисленные 8-разрядные вычисления, этот способ использовать напрямую нельзя, погрешности округлений сделают результат бесполезным.
Можно промежуточное изображение (mix) привести к 48-битной глубине цвета (по 16 бит на каждую компоненту, например в формате PNG48), тогда этот алгоритм можно будет использовать. Правда на каждой операции будет теряться 1-2 значащих бита, но думаю, что в итоговом изображении это будет незаметно. И кроме того точность этого способа будет сильно падать в увеличением количества изображений в серии (например для 1440 поминутных фотографий на каждой итерации будет теряться до 4-5 значащих битов).
Еще более правильным было бы использовать такую формулу:
Код: plaintext
1.
mix' = mix' - img287 + img0
mix = mix'/288
Это был бы идеальный вариант, в котором значащие разряды не теряются, но тогда придется забыть про использование готовых инструментов/утилит. Чтобы использовать такой подход с изображениями. нужна минимум 72-битная глубина цвета (по 24 бита на каждую компоненту), а это возможно разве что в TIFF, причем не факт, что GD или ImageMagick с таким форматом сможет работать.

Но кроме таких "лобовых" алгоритмов мне подсказали довольно интересный альтернативный способ.
Для него я использую буфер промежуточных вычислений/изображений.
В виде формулы его можно записать как:
Код: plaintext
1.
2.
3.
4.
mix(0) = img1
mix(1) = img2+img3
mix(2) = img4+img5+img6+img7
...
То есть в буфере хранятся результаты попарных наложений изображений, а на каждой итерации они сдвигаются вниз по стеку и суммируются с предыдущими изображениями:
Код: plaintext
1.
2.
mix(0) = img0+img1
mix(N) = mix(N) + mix(N-1) + ... + mix(0)
Буфер на 10 элементов позволяет хранить до 1024 промежуточных изображений, из которых можно будет сформировать любое требуемое количество объединенных фотографий.
Этот способ не очень удобен в применении и его сложно оптимизировать, а кроме того количество операций наложения в худшем случае будет log2(288), но зато в нем нет погрешности вычислений и его можно применять с любым количеством изображений в серии.
...
Рейтинг: 0 / 0
31.10.2019, 14:16
    #39883622
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
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
Это был бы идеальный вариант, Не очень ясно, скорее всего речь о ср.арифметическом. Пусть даже и в скользящем варианте. Идеально что?
...
Рейтинг: 0 / 0
31.10.2019, 14:27
    #39883628
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B.,
3) Ты уж определись, что более важно и насколько. Скорость вычислений, формат операндов, математ-кая корректность, или красота(вкл. исчезающую улыбку Чеширского кота) ? Я не понимаю, что за мазохизм, когда жалеют железную машину (типа перетрудится, болезная) путём собственных извращений с градациями 128б, 513б, 2048б и т.д. Double обеспечит нужную красоту без мазохизма.

4) Насчёт ср.арифм-кого. Ну плавающее ср. оно и есть плавающее. Меня ночью Муза посетила в одном из нарядов от Закона больших чисел. И мне показалось, что ср.арифм будет давать эффект (на длинных последовательностях) в виде Гауссова размытия. Интересно убедиться в этом. (мож я и сам выберу время когда-нить)
...
Рейтинг: 0 / 0
31.10.2019, 14:32
    #39883633
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
А есть обучающая выборка картинок? Для тренировки
...
Рейтинг: 0 / 0
31.10.2019, 14:33
    #39883636
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B.,
5) Гауссово размытие может случиться, если в самом деле кадры будут достаточно "стационарны" в статистическом смысле (З-н Б-х Ч-л). Видеонаблюдение в помещении, камера неподвижна, освещение вкл-выкл не каждый час, достататочное разрешение камеры ...
Те же условия, похоже, нужны и для достижения той самой идеи о красоте суммы кадров.
...
Рейтинг: 0 / 0
31.10.2019, 14:36
    #39883641
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
mayton, привинти смартфон к спинке стула на 1 час. Потом снимешь показания каждые 5 сек - вот тебе и выборка ... В качестве редклго движения иногда махни ладонью в его поле зрения.
...
Рейтинг: 0 / 0
31.10.2019, 14:39
    #39883646
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B., ах да, блин!
6) Муза ещё что-то бормотала про скользящую медиану)) Правда с рекуррентностью тут ... видимо, для оптимизации придётся неск. буферных матриц хранить (пояление сэра Мэйтона напомнило).
...
Рейтинг: 0 / 0
31.10.2019, 14:43
    #39883650
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
exp98mayton, привинти смартфон к спинке стула на 1 час. Потом снимешь показания каждые 5 сек - вот тебе и выборка ... В качестве редклго движения иногда махни ладонью в его поле зрения.
Да я лучше возьму красивое цветное видео в FullHD. Потом утилиту типа ffmeg и получу набор картинок *.bmp.

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

Всегда так. С тестовыми данными. Мдя.
...
Рейтинг: 0 / 0
31.10.2019, 14:58
    #39883674
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
exp98Ты уж определись, что более важно и насколько.
Как обычно, нужен разумный баланс.
Обрабатываться будет на более-менее производительном сервере, так что даже если я буду тупо каждый раз обрабатывать все изображения, он наверное будет успевать это делать.
Но зачем вхолостую греть воздух, если можно оптимизировать процесс без ухудшения качества?

maytonА есть обучающая выборка картинок? Для тренировки
Есть, если пережать в 720p, то примерно 30 МБ за сутки.
Если интересно, могу выложить минут через 20.
...
Рейтинг: 0 / 0
31.10.2019, 15:14
    #39883687
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Alibek B....без ухудшения качества
авторDouble обеспечит нужную красоту без мазохизма. , об этом ещё до меня написали ...
Возможно, правда, где-то что-то всё же придётся округлять вверх, чтобы совсем в 0 не встало.
...
Рейтинг: 0 / 0
31.10.2019, 15:16
    #39883689
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Пробую материализовывать авторские мыслеформы далее.
Начальный пост (а...ё) содержит некоторые пожелания, что из этого оставляем?
а) ("красота")Мне нужно сделать из них что-то вроде фотографии со сверхдлинной выдержкой, на которой неподвижные объекты будут отображены почти нормально, а движущиеся объекты будут малозаметны или незаметны
б) ("птичку жалко")Но такая реализация будет генерировать очень большую вычислительную нагрузку на сервер.
в) ("рекуррентность") Я бы хотел не накладывать все 288 фотографий каждый раз, а при каждой итерации накладывать только текущую
г) ("скользящее среднее") Чем-то нужное мне поведение похоже на вычисление скользящего среднего
д) ("пикселов жалко") Но к изображениям такой подход не применить, у них конечная разрядность для каждого пиксела.
е) ("черновой вариант") "затемнять" итоговое изображение, а затем накладывать на него текущее изображение с прозрачностью. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
(Видимо, эту мыслеформу я уже материализовал формулой.)
ё) ("такая задача") может быть есть другие способы решения такой задачи?
Какова, всё же, задача,особенно учитывая последующее ср.арифметическое:
ж) ("полное ср.арифм") Пока что я пришел к тому, чтобы ...: mix = mix - old/288 + new/288.
(ИМХО, в этом варианте для общего случая равные веса не обеспечивают робастность, например к титрам)
...
Рейтинг: 0 / 0
31.10.2019, 15:29
    #39883707
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
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
...
Рейтинг: 0 / 0
31.10.2019, 15:35
    #39883712
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
Нужно только A — усреднение всех изображений за сутки.
Ограничения реализации: обработка изображений будет выполняться bash+ImageMagick, поэтому реализация должна быть манипуляциями с изображениями (а не сохранение значений пикселов в CSV и работа с dword/float).
Пожелания: разумная оптимизация, чтобы не пересчитывать заново то, что можно не пересчитывать.

> е) ("черновой вариант") "затемнять" итоговое изображение, а затем накладывать на него текущее изображение с прозрачностью. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
Не совсем так.
Под затемнением и наложением я имел ввиду не blend с определенным коэффициентом прозрачности (тогда чем изображение свежее, тем у него будет больший вес), а арифметические операции вычитания и сложения над изображениями, умноженными на константу (тогда у всех изображений будет равный вес).
...
Рейтинг: 0 / 0
31.10.2019, 15:41
    #39883718
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наложение серии изображений
maytonНадеялся что участники топика заготовили тестовые данные. Но... не вышло... Принцип минимального действия в действии, www. halyave. net.
А вообще, яписал выше, что мне и самому интересно результаты увидеть воочию на разных моделях. Но неспеша. М.б.дней через 10-15(если ТС сам раньше не покажет рез-ты).
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Наложение серии изображений / 25 сообщений из 166, страница 1 из 7
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]