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

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

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

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

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

Alibek B.и утилиту
Gimp
...
Рейтинг: 0 / 0
Наложение серии изображений
    #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
Наложение серии изображений
    #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
Наложение серии изображений
    #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
Наложение серии изображений
    #39883628
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,
3) Ты уж определись, что более важно и насколько. Скорость вычислений, формат операндов, математ-кая корректность, или красота(вкл. исчезающую улыбку Чеширского кота) ? Я не понимаю, что за мазохизм, когда жалеют железную машину (типа перетрудится, болезная) путём собственных извращений с градациями 128б, 513б, 2048б и т.д. Double обеспечит нужную красоту без мазохизма.

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

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

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

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

> е) ("черновой вариант") "затемнять" итоговое изображение, а затем накладывать на него текущее изображение с прозрачностью. Теоретически следы суточной давностью полностью сойдут на нет и должно получится что-то более-менее похожее на сверхдолгую выдержку.
Не совсем так.
Под затемнением и наложением я имел ввиду не blend с определенным коэффициентом прозрачности (тогда чем изображение свежее, тем у него будет больший вес), а арифметические операции вычитания и сложения над изображениями, умноженными на константу (тогда у всех изображений будет равный вес).
...
Рейтинг: 0 / 0
Наложение серии изображений
    #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]