5 заметок с тегом

анализ траекторий движения

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

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

К сожалению наши видео получаются низкоконтастными, поэтому программы трекинга не могут корректно выделить подвижные объекты.

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


Узнать больше и скачать скрипт.


 Нет комментариев    18   11 мес   анализ траекторий движения   обработка видео   скрипт

Провал первой попытки прослеживания путей перемещения протист

Профессор Плейшнер шел по улице. Проходя мимо явочной квартиры, он мельком взглянул на окно. Занавеска была отодвинута. На подоконнике стояло семнадцать утюгов и один цветок. «Явка провалена», — понял Плейшнер.


Это третья, аналитическая заметка из серии об анализе траектории движения протист.

В первой заметке объяснил, как с помощью ffmpeg осветлить видео снятое на фотоаппарат, соединенный с микроскопом.

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

Напомню, что видео необходимо для построения траекторий движения микроорганизмов.




Для решения задачи использую Трекмейт (TrackMate).

Трекмейт — это плагин к Фи-джи (Fiji), который предназначен для прослеживания, визуализации, редактирования и анализа траекторий движения объектов, снятых на видео. Интерфейс Трекмейта состоит из последовательности диалоговых окон, в которых необходимо выбрать алгоритмы обработки видеоизображений и указать параметры этих алгоритмов.


Мои попытки научить Трекмейт проследить траектории микроорганизмов провалились.




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

Пробовал пороговую сегментацию (tresholding detector) и методы сегментации по инвариантным точкам (invariant feature detectors): LoG (Laplassian of Gaussian, Лапласиан Гаусиана :), DoG (differences of Gaussians, разница Гаусианов), Hessian (детектор Гессе).

Пороговая сегментация нашла всего один объект, а алгоритмы сегментации по инвариантным точкам приняли за объект каждое пятнышко.

Детектор Гессе приметил каждое пятнышко

Другие доступные методы сегментации не попробовал.




Далее взял результаты сегментации изображения детектором Гессе и, путем интуитивно-случайного подбора параметров (не записал их значения), оставил выделенными только нужные организмы и несколько мусорных пятен.

Однако их траектории проследить не удалось.

Трекинг построил слишком короткие пути и не все относятся к протистам.

Много коротких, частично некорректных треков — это провал




Cделал следующие выводы:

  1. Необходимо хотя бы в общих чертах понимать, как работают алгоритмы сегментации и трекинга, как на них влияют параметры и когда их стоит применять, а когда нет.
  2. Качество видеоизображений следует еще более улучшить: повысить контраст между подвижными организмами и статичным фоном, фон сгладить или вообще удалить.
  3. Желательно автоматически создать маску, на которой организмы будут отмечены цветом, а фон будет белым.
  4. Следует попробовать иные способы сегментации или другие программы выделения треков.

Об этом расскажу в другой раз.




Всем прочитавшим — Лаплассиана Гауссинана :)

Комбинируем кадры движения протист в многослойные тифы

В первой заметке рассказал, как улучшить качество видео и нарезать его на кадры.


Это вторая техническая заметка из серии об анализе траектории движения протист. В ней поговорим, как объединить кадры видео в пакеты по сто кадров и сохранить их в многослойных тифах.

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


В конце заметки приведена ссылка на скрипт, который преобразует mov в многослойные tif

Последовательность действий

Буду использовать ИмеджМаджик и батч-скрипт Виндоус. (Вместо последнего можно взять Поверскрипт, для Линукса — баш, но это вы уже сами :).

Скрипт разделяет тифы на группы: 1...100, 100...200, 200...300, ... и объединяет файлы из каждой группы в многослойный тиф.

Последний тиф группы совпадает с первым тифов седующей группы: 1...100≡100...200≡200... Так сделано для того, чтобы потом программа смогла правильно соединить кусочки траекторий, выделенные в группах, в целые траектории.

Инициализируем вспомогательные переменные

Итак, мы получили серию тифов, каждый из которых хранит один кадр. Тифы лежат в отдельном каталоге и шаблонно пронумерованы:

  • frame_0001.tif, frame_0002.tif, frame_0003.tiff, ...

Укажем в батч-скрипте название каталога, префикс тиф-файлов и префикс многослойных тифов.

rem Инициализируем вспомогательные переменные
:initialization
    set tif_file_prefix=frame_
    set group_file_prefix=merged_
    set tifs_dir=tifs

Посчитаем число тифов

Мы не знаем, сколько файлов у нас есть. Поэтому воспользуемся советом и напишем скрипт:

rem Считает число тифов в заданном каталоге
:calc-tifs-number
    cd %tifs_dir%
    dir *.tif /A:-D /B 2>nul | find /c /v "" > tmp
    set /p tifs_numb=<tmp
    set /a tifs_numb+=0
    del tmp
    cd ..

Скрипт переходит в каталог с тифами, записанном в переменной tifs_dir, считает число тифов и запоминает его в файле tmp, загружает значение из этого файла в переменную tifs_numb и удаляет tmp-файл.

Подсчет и сохранение числа в файл выполняет команда

dir *.tif /A:-D /B 2>nul | find /c /v "" > tmp

где опция

*.tif выбирает только тиф-файлы;
/A:-D убирает из подсчета каталоги и оставляет только файлы;
/B выводит только названия файлов;
2>nul не выводит строки с ошибками;
| передает полученный список файлов следующей команде;
find /c /v "" считает число строк в списке файлов;
> tmp запоминает полученное число в файл tmp.

Прочие команды скрипта очевидны.

Вычисляем количество групп файлов и число файлов в последней группе


set /a num_groups=1+(%tifs_numb%-1)/100
set /a numb_in_last_group=(%tifs_numb%)%%100

Объединяем тифы каждой группы в один многослойный тиф

В Имеджмаджик есть утилита convert, которая с ключом -adjoin объединяет тифы в один многослойный.

convert 0001.tif 0002.tif ... 100.tif -adjoin merged_1-100.tif
convert 0100.tif 0101.tif ... 200.tif -adjoin merged_100-200.tif
...

Параметрами команды служат названия файлов. В первой группе у нас сто тифов, во всех остальных, кроме последней, сто один тиф, в последней — оставшиеся файлы.

Для формирования cписка файлов используем цикл, после завершения которого все тифы будут объединены в многослоные тифы.

set /a file_index=0
set /a group_index=0

cd %tifs_dir%
    rem Пробегаем по каждой группе
    for /l %%G in (1,1,%num_groups%) do call :loop_groups %%G
cd ..

echo All tifs have been merged into multilayered tifs
pause

goto :eof

Цикл вызывает подпрограмму :loop_groups, где и происходит слияние. Подпрограмма принимает номер группы, вычисляет для нее номера первого и последнего файла, формирует список файлов с этими номерами и, в итоге, объединяет их в многослойный тиф.


:loop_groups

rem Определям начальный и конечный номер файла в группе
set /a start_index=group_index*100

if %1 EQU %num_groups% (
    rem Это последняя группа
    set /a finish_index=start_index+%numb_in_last_group%
) else (
    rem Это не последняя группа
    set /a finish_index=start_index+100
)

if %start_index% EQU 0 set /a start_index=1


rem Формируем список файлов.
rem Для этого перебираем номера файлов от start_index до finish_index
rem и конструируем название файла с каждым номером в пп loop_files
set file_list=
for /l %%H in (%start_index%,1,%finish_index%) do call :loop_files %%H


rem Задаем имя результирующего многослойного тифа
set merged_file=%group_file_prefix%_%start_index%-%finish_index%.tif


rem Конвертируем
convert %file_list% -adjoin %merged_file%


rem Переходим к следующей группе
set /a group_index=group_index+1

goto :eof

Сам список файлов поэлементно строится в подпрограмме :loop_files. Она принимает номер файла, дополняет его нулями, добавляет к нему префикс и помещает в конец списка (строки).

:loop_files
rem Добавляет ведущие нули к индексу файла
set "file_index=0000%1"
set "file_index=%file_index:~-4%"

rem Дополняет файл префиксом
set file_name=%tif_file_prefix%_%file_index%.tif

rem Добавляет название файла в конец списка
set "file_list=%file_list%%file_name% "
	
goto :eof

Итоговый скрипт

Готовый батч-скрипт пробразует mov в многослойные tiff.

Он использует код из двух заметок и:

  • спрашивает название мув-файла с видео;
  • спрашивает, нужно ли осветлить видео;
  • спрашивает название каталога, куда следует поместить многослойные тифы;
  • спрашивает, нужно ли удалить тифы с отдельными кадрами после завершения работы.


Скачать скрипт mov-to-tifs

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


Для работы скрипта необходимо установить ImageMagick.


Вопросы, связанные с функционирование скрипта, задавайте в комментариях.

 Нет комментариев    44   2023   imagemagick   анализ траекторий движения   батч-файл   обработка видео   скрипт

Улучшаем качество видео движения протист и нарезаем его на кадры

Это заметка из серии об анализе траектории движения протист. В ней поговорим, как улучшить качество видео и нарезать его на кадры.



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

Темное низкоконтрастное видео

Поэтому интересующие нас простейшие незначительно отличаются от фона.

Кадр исходного видео

Если в графическом редакторе автоматически улучшить контраст, получится хорошо.

Автоматическое осветление

Если подправить гистограмму, тоже выйдет неплохо.

Коррекция гистограммы улучшает заметность живых объектов и грязи на стекле; грязь мешает, но она неподвижна, поэтому после прослеживания траекторий, мы ее уберем

Очевидно, что использовать графический редактор для исправления всех кадров — нереально. Поэтому нагрузим работой компьютер: улучшим видео с помощью FFmpeg.

Улучшаем видео с помощью ffmpeg

Фотоаппарат записыват видео в формате mov (мув). FFmpeg осветлит его и покадрово сохранит в заданном каталоге.

Осветляем видео
Следующая команда читает исходный видеофайл input.mov и исправляет гистограмму каждого кадра так, чтобы черная точка сдвинулась до 64 (0,25~64/255), а белая — до 120 (0,47~120/255).

ffmpeg -i input.mov 
-vf "monochrome ,
     colorlevels=romin=0.25:rimax=0.47:gomin=0.25:gimax=0.47:bomin=0.25:bimax=0.47 ,
     smartblur=2.0:-0.7:-3.5:0.65:0.25:2.0"
output.avi

Опция -vf говорит, что мы применяем фильтры, влияющие на качество изображения.

  • Фильтр monochrome делает видео черно-белым.
  • Фильтр colorlevels выполняет коррекцию гистограммы. Его параметры:
    • r|g|b|omin задают уровень красной, зеленой и синей компоненты минимальной (черной) точки,
    • r|g|b|imax соответственно максимальной (белой);
    • значения компонент лежат в диапазоне [0; 1], что соответствует уровням [0; 255].
  • Фильтр smartblur немного шарпит границы — делает их более резкими.

Команда записывает результат в файл output.avi.

Чтобы фильтры обработали видео, выходной файл должен иметь иной формат, отличный от мув. В данном случае — это avi. Однако при конвертации в ави качество обработанного видео ухудшается. Поэтому поступим по иному.

Запишем каждый кадр обработанного видео в отдельный файл
Для этого заменим последнюю срочку команды на следующую:

-compression_algo lzw -pix_fmt rgb24 enhanced/frame_%04d.tif

Она сохранит каждый кадр обработанного видео в сжатом тиф-файле (-compression_algo lzw -pix_fmt rgb24) в каталоге enhanced. Тифы получат префикс frame_ и будут пронумерованы четырехзначным номером с ведущими нулями (%04d):

  • frame_0001.tif, frame_0002.tif, frame_0003.tif, ....

Вся команда выглядит так:

ffmpeg -i input.mov 
-vf "monochrome ,
     colorlevels=romin=0.25:rimax=0.47:gomin=0.25:gimax=0.47:bomin=0.25:bimax=0.47 ,
     smartblur=1.5:-0.35:-3.5:0.65:0.25:2.0"
-compression_algo lzw -pix_fmt rgb24 enhanced/frame_%04d.tif

Результат радует.

Осветленные кадры видео

Резюме

Чтобы осветлить видео и покадрово сохранить его в заданном каталоге, используйте приведенную команду ffmpeg.

В дальнейшем тифы понадобятся для формирования многослойных тифов, которые будут использованы для выделения треков протист.



На сегодня все.

 Нет комментариев    85   2023   ffmpeg   анализ траекторий движения   обработка видео

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


Последнее обновление 5 янв. 2024 года.

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

Задача: определить, что меняется в движении протист при разных условиях

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


Оглавление серии

Ниже приведен список шагов, оформленный в виде оглавления, и даны ссылки на готовые заметки с подробным описанием каждого шага. Шаги предварительные, они будут появляться и, иногда, исчезать. О том, как выращивать и поддерживать культуры одноклеточных и как снимать видео через микроскоп рассказывать не буду.


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


Немного о рутине

Обычно для выполнения рутинной работы берется (один) аспирант или инженер, который своим (еще не растраченным) упорством добивает этот этап до более-менее приемлемого результата. В худшем случае рутиной занимаются сами идеологи или один из них, который, впоследствии, еще и отхватывает пинков за ошибки. (О времена, о нравы!) Я же, по возможности, буду автоматизировать рутинные этапы, заставляя потеть машину.


Необходимый софт

Для автоматизации рутины использую:

  • Пакетный файл Виндоус (батч-файл, bat-файл)
  • Баш (bash) Юникса для исполнения алгоритмов обработки видео и изображений;
  • FFmpeg для автоматической работы с видео;
  • ImageMagick для автоматической обработки изображений кадров;
  • Fiji для построения траекторий.
  • Эр для выделения объектов на кадрах и построения траекторий движения объектов.

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


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