Скрипт для бинаризации видео движения микроорганизмов

С 6 мая по 16 апреля 2023 г.

Задача: написать скрипт для конвертирования кадров видеозаписи движения микроорганизмов в бинарный вид

Скачать скрипт батч-файл Виндоус, использует ImageMagick (IM) и FFmpeg (FM).

Скрипт работает под Виндоус. Для Мака или Линукса нужно переделать код скрипта, но команды IM и FM останутся теми же.

Как сослаться

В научной статье укажите ссылку на публикацию:
Лях А. М., Рауэн Т. В., Муханов В. С. Методика бинаризации кадров видеосъемки движения микроорганизмов // Системы контроля окружающей среды. 2023. Т. 2.
В соцсетях или блоге сошлитесь на эту страницу:
Скрипт для бинаризации видео движения микроорганизмов. https://antonlyakh.ru/done/mov2bin/

Для чего нужен скрипт

Траектории движения микроорганизмов это один из наиболее доступных источников данных об их реакции на внешние условия. Траектории изучают по видеозаписям. Специализированные программы трекинга обрабатывают видеоматериал и строят траектории, а мы при помощи математических методов анализируем характеристики траекторий и делаем выводы о зависимости двигательных паттернов микроорганизмов от окружающих условий.

К сожалению наше видео получается низкоконтастным и программы трекинга не могут корректно опознать подвижные объекты. По этой причине я написал скрипт, который улучшает заметность подвижных объектов. Для этого скрипт конвертирует видео в черно-белый (бинарный) формат.

Необходимые программы

FFmpeg для нарезания видео на кадры.
ImageMagick версии 7 (или выше) для работы с изображениями кадров.

Как пользоваться

Скачайте скрипт. Переместите его в отдельный каталог. Поместите туда же видеофайлы. Запустите скрипт. Укажите название видеофайла.

Скрипт приступит к бинаризации видео. Это может занять много времени.

Если у вас не очень мощный компьютер, то видео длительностью около минуты скрипт может преобразовывать около получаса.

В результате получите бинаризованные кадры.


Исходные данные и результат

Пусть invideo.mov — исходный видеофайл.
После запуска скрипта будут созданы:
invideo/ — рабочий каталог с необработанными кадрами: invideo__00001.png, invideo__00002.png, ...;
invideo/bw/ — каталог с бинаризованными кадрами: invideo-bw__00001.png, invideo-bw__00002.png, ...;
invideo/tif/ — каталог с многослойными тифами (в данном случае по 300 кадров в тифе): invideo__00001-00300.tif, invideo__00300-00600.tif, ...;
invideo/bin-mov/ — каталог с черно-белым видео invideo-bw.mov.

Технические ограничения

Скрипт бинаризирует кадры с узкой гистограммой и хорошо выделяет объекты размером 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 -channel r -separate -auto-level -level 70%,100%,3 -blur 30 -negate -lat 30x30+5% -scene 1 invideo\bw\invideo-bw__%05d.png

invideo — название видеофайла, замените его на свое.


Скачать скрипт батч-файл Виндоус, использует ImageMagick и FFmpeg.