С 6 мая по 16 апреля 2023 г.
Задача: написать скрипт для конвертирования кадров видеозаписи движения микроорганизмов в бинарный вид
Скачать скрипт батч-файл Виндоус, использует ImageMagick (IM) и FFmpeg (FM).
Скрипт работает под Виндоус. Для Мака или Линукса нужно переделать код скрипта, но команды IM и FM останутся
Траектории движения микроорганизмов это один из наиболее доступных источников данных об их реакции на внешние условия. Траектории изучают по видеозаписям. Специализированные программы трекинга обрабатывают видеоматериал и строят траектории, а мы при помощи математических методов анализируем характеристики траекторий и делаем выводы о зависимости двигательных паттернов микроорганизмов от окружающих условий.
К сожалению наше видео получается низкоконтастным и программы трекинга не могут корректно опознать подвижные объекты. По этой причине я написал скрипт, который улучшает заметность подвижных объектов. Для этого скрипт конвертирует видео в черно-белый (бинарный) формат.
FFmpeg для нарезания видео на кадры.
ImageMagick версии 7 (или выше) для работы с изображениями кадров.
Скачайте скрипт. Переместите его в отдельный каталог. Поместите туда же видеофайлы. Запустите скрипт. Укажите название видеофайла.
Скрипт приступит к бинаризации видео. Это может занять много времени.
Если у вас не очень мощный компьютер, то видео длительностью около минуты скрипт может преобразовывать около получаса.
В результате получите бинаризованные кадры.
Скрипт бинаризирует кадры с узкой гистограммой и хорошо выделяет объекты размером 7-14 пикселей. Для улучшения изображений с иным распределением цветов или выделения объектов иного размера следует подкорректировать параметры команд. Эти парамеры отмечены ниже.
Допустим видеофайл называется invideo.mov.
1. Выделяем кадры
Скрипт при помощи ffmpeg выделяет кадры видео invideo.mov и записывает их в каталог invideo:
ffmpeg -i invideo.mov invideo\invideo_%05d.png
Кадры нумеруются, начиная с 00001: invideo_00001.png, invideo_00002.png, и до последнего кадра.
Далее для обработки скрипт использует ImageMagick, команда magick
.
2. Растягиваем гистограмму
Гистограмма каждого кадра получается узкой, пирамидальной. Канал красного цвета более яркий.
Поэтому далее скрипт вырезает канал красного цвета -channel r -separate
и автоматически растягивает гистограмму на весь диапазон цветов -auto-level
.
magick *.png -channel r -separate -auto-level -scene 1 invideo-r__%05d.png
Команда -scene 1
показывает, что результирующие кадры нужно нумеровать, начиная с единицы.
В результате получаем: invideo-r_00001.png, invideo-r_00002.png, ....
3. Корректируем уровни
Чтобы еще больше повысить контраст, корректируем уровни черного и белого цвета и гамму (общую яркость): черный сдвигаем до 70%, белый оставляем, как есть — 100%, а гамму повышаем до трех.
magick *.png -level 70%,100%,3 -scene 1 invideo-levels__%05d.png
Параметры подобраны для конкретноой гистограммы. Если гистограмма будет другой, нужно будет использовать другие параметры.
В результате получаем: invideo-levels_00001.png, invideo-levels_00002.png, ....
4. Фильтруем
Наконец немного размываем полученное изображение -blur 30
, инвертируем -negate
и применяем адаптивную пороговую фильтрацию -lat
с ядром фильтра 30×30 пикселей.
magick *.png -blur 30 -negate -lat 30x30+5% -scene 1 invideo-bw__%05d.png
Ядро фильтра подобрано так, чтобы подчеркнуть пятна размером 7-14 пикселей. Именно такой размер имеют изображения динофитовых водорослей. Для объектов иного размера ядро фильтра также должно быть другим.
В результате получаем хорошие бинарные изображения, на которых видны все микроорганизмы.
5. Не обязательно
Время выполнения этого шага сопоставимо со временем выполнения предыдущих шагов. Но полученные картинки не влияют на результат трекинга. Поэтому данный шаг можно пропустить.
Дополнительно можно удалить мелкие пятна медианным фильтром -median 9x9
, и линии сетки, при помощи удаления связных областей -connected-components
с площадью более 130 пикселей.
Для этого сначала выделим связанные области.
-define connected-components:area-threshold=130 -define connected-components:mean-color=true -connected-components 8
-negate
Затем вычтем результат из исходных изображений и применим медианный фильтр.
-compose darken -composite -median 9x9
Целиком команда выглядит так:
magick invideo-bw__00001.png ( +clone -define connected-components:area-threshold=130 -define connected-components:mean-color=true -connected-components 8 -negate ) -compose darken -composite -median 9x9 invideo-rr__00001.png
Она работает только для одного файла. Поэтому в нее нужно по очереди подставлять название каждого файла.
6. Все шаги двумя командами
ffmpeg -i invideo.mov invideo\invideo_%05d.png
magick invideo\*.png
invideo — название видеофайла, замените его на свое.
Скачать скрипт батч-файл Виндоус, использует ImageMagick и FFmpeg.