<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Математик среди биологов: заметки с тегом скрипт</title>
<link>https://antonlyakh.ru/blog/tags/skript/</link>
<description>Я немного умею складывать, но от вычитания у меня всегда кружится голова</description>
<author>Антон Лях</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Антон Лях</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Я немного умею складывать, но от вычитания у меня всегда кружится голова</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Написал скрипт для бинаризации видео движения микроорганизмов</title>
<guid isPermaLink="false">468</guid>
<link>https://antonlyakh.ru/blog/all/napisal-skript-binarizacii-video-dvizheniya-microorganismov/</link>
<pubDate>Sun, 28 May 2023 15:49:31 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/napisal-skript-binarizacii-video-dvizheniya-microorganismov/</comments>
<description>
&lt;div style="width:400px; overflow:hidden; display:inline-block;"&gt;&lt;p&gt;&lt;video autoplay="" loop="" style="position: relative; left:-120px"&gt;&lt;source src="https://antonlyakh.ru/done/mov2bin/i/dsc_0945--clr-640.mp4" type="video/mp4"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="width:400px; overflow:hidden; display:inline-block;"&gt;&lt;p&gt;&lt;video autoplay="" loop="" style="position: relative; left:-120px"&gt;&lt;source src="https://antonlyakh.ru/done/mov2bin/i/dsc_0945--bw-640.mp4" type="video/mp4"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Траектории движения микроорганизмов — легко доступный источник данных об их реакции на внешние условия. Траектории изучают по видеозаписям, которые обрабатывают специализированные программы трекинга.&lt;/p&gt;
&lt;p&gt;К сожалению наши видео получаются низкоконтастными, поэтому программы трекинга не могут корректно выделить подвижные объекты.&lt;/p&gt;
&lt;p&gt;По этой причине я написал скрипт, который переводит видео в черно-белый (бинарный) формат, что существенно улучшает заметность подвижных объектов.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://antonlyakh.ru/done/mov2bin/"&gt;Узнать больше и скачать скрипт&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Комбинируем кадры движения протист в многослойные тифы</title>
<guid isPermaLink="false">465</guid>
<link>https://antonlyakh.ru/blog/all/kombiniruem-kadry-dvizheniya-protist-v-mnogosloynye-tify/</link>
<pubDate>Fri, 24 Feb 2023 22:59:48 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/kombiniruem-kadry-dvizheniya-protist-v-mnogosloynye-tify/</comments>
<description>
&lt;p&gt;В первой заметке рассказал, &lt;a href="/blog/all/uluchshaem-kachestvo-video-dvizheniya-protist-i-narezaem-ego-na/"&gt;как улучшить качество видео и нарезать его на кадры&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Это вторая техническая заметка из &lt;a href="/blog/all/seriya-zametok-ob-analize-traektoriy-dvizheniya-protist/"&gt;серии об анализе траектории движения протист&lt;/a&gt;. В ней поговорим, как объединить кадры видео в пакеты по сто кадров и сохранить их в многослойных &lt;abbr&gt;тифах&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Напомню, что шаманю над видео по двум причинам: из-за скрипта для выделения траекторий, который плохо понимает видеоформаты, но отлично работает с &lt;abbr&gt;тифами&lt;/abbr&gt;, а также из-за небольшой оперативки, которой не хватает для обработки тяжелых &lt;abbr&gt;тифов&lt;/abbr&gt;. Поэтому приходится их резать.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;big&gt;В конце заметки приведена ссылка на скрипт, который преобразует &lt;abbr&gt;mov&lt;/abbr&gt; в многослойные &lt;abbr&gt;tif&lt;abbr&gt;&lt;/big&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;Последовательность действий&lt;/h3&gt;
&lt;p&gt;Буду использовать &lt;abbr&gt;&lt;a href="https://imagemagick.org/"&gt;ИмеджМаджик&lt;/a&gt;&lt;/abbr&gt; и &lt;a href="https://ss64.com/nt/"&gt;батч-скрипт Виндоус&lt;/a&gt;. (Вместо последнего можно взять &lt;abbr&gt;Поверскрипт&lt;/abbr&gt;, для Линукса — &lt;abbr&gt;баш&lt;/abbr&gt;, но это вы уже сами :).&lt;/p&gt;
&lt;p&gt;Скрипт разделяет &lt;abbr&gt;тифы&lt;/abbr&gt; на группы: 1...100, 100...200, 200...300, ... и объединяет файлы из каждой группы  в многослойный &lt;abbr&gt;тиф&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Последний &lt;abbr&gt;тиф&lt;/abbr&gt; группы совпадает с первым &lt;abbr&gt;тифов&lt;/abbr&gt; седующей группы: 1...100≡100...200≡200... Так сделано для того, чтобы потом программа смогла правильно соединить кусочки траекторий, выделенные в группах, в целые траектории.&lt;/p&gt;
&lt;h4&gt;Инициализируем вспомогательные переменные&lt;/h4&gt;
&lt;p&gt;Итак, мы получили серию &lt;abbr&gt;тифов&lt;/abbr&gt;, каждый из которых хранит один кадр. &lt;abbr&gt;Тифы&lt;/abbr&gt; лежат в отдельном каталоге и шаблонно пронумерованы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;frame_0001.tif, frame_0002.tif, frame_0003.tiff, ...&lt;/kbd&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Укажем в батч-скрипте название каталога, префикс &lt;abbr&gt;тиф&lt;/abbr&gt;-файлов и префикс многослойных &lt;abbr&gt;тифов&lt;/abbr&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;rem Инициализируем вспомогательные переменные
:initialization
    set tif_file_prefix=frame_
    set group_file_prefix=merged_
    set tifs_dir=tifs&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Посчитаем число тифов&lt;/h4&gt;
&lt;p&gt;Мы не знаем, сколько файлов у нас есть. Поэтому воспользуемся &lt;a href="https://superuser.com/a/1530244/521108"&gt;советом&lt;/a&gt; и напишем скрипт:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;rem Считает число тифов в заданном каталоге
:calc-tifs-number
    cd %tifs_dir%
    dir *.tif /A:-D /B 2&amp;gt;nul | find /c /v &amp;quot;&amp;quot; &amp;gt; tmp
    set /p tifs_numb=&amp;lt;tmp
    set /a tifs_numb+=0
    del tmp
    cd ..&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Скрипт переходит в каталог с тифами, записанном в переменной &lt;kbd&gt;tifs_dir&lt;/kbd&gt;, считает число тифов и запоминает его в файле &lt;kbd&gt;tmp&lt;/kbd&gt;, загружает значение из этого файла в переменную &lt;kbd&gt;tifs_numb&lt;/kbd&gt; и удаляет &lt;kbd&gt;tmp&lt;/kbd&gt;-файл.&lt;/p&gt;
&lt;p&gt;Подсчет и сохранение числа в файл выполняет команда&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;dir *.tif /A:-D /B 2&amp;gt;nul | find /c /v &amp;quot;&amp;quot; &amp;gt; tmp&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;где опция&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;kbd&gt;*.tif&lt;/kbd&gt; выбирает только &lt;abbr&gt;тиф&lt;/abbr&gt;-файлы;&lt;br /&gt;
&lt;kbd&gt;/A:-D&lt;/kbd&gt; убирает из подсчета каталоги и оставляет только файлы;&lt;br /&gt;
&lt;kbd&gt;/B&lt;/kbd&gt; выводит только названия файлов;&lt;br /&gt;
&lt;kbd&gt;2&gt;nul&lt;/kbd&gt; не выводит строки с ошибками;&lt;br /&gt;
&lt;kbd&gt;|&lt;/kbd&gt; передает полученный список файлов следующей команде;&lt;br /&gt;
&lt;kbd&gt;find /c /v &amp;quot;&amp;quot;&lt;/kbd&gt; считает число строк в списке файлов;&lt;br /&gt;
&lt;kbd&gt;&gt; tmp&lt;/kbd&gt; запоминает полученное число в файл &lt;kbd&gt;tmp&lt;/kbd&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Прочие команды скрипта очевидны.&lt;/p&gt;
&lt;h4&gt;Вычисляем количество групп файлов и число файлов в последней группе&lt;/h4&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;set /a num_groups=1+(%tifs_numb%-1)/100
set /a numb_in_last_group=(%tifs_numb%)%%100&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Объединяем тифы каждой группы в один многослойный тиф&lt;/h4&gt;
&lt;p&gt;В &lt;abbr&gt;Имеджмаджик&lt;/abbr&gt; есть утилита &lt;kbd&gt;convert&lt;/kbd&gt;, которая с ключом &lt;kbd&gt;-adjoin&lt;/kbd&gt; объединяет &lt;abbr&gt;тифы&lt;/abbr&gt; в один многослойный.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;kbd&gt;convert 0001.tif 0002.tif ... 100.tif -adjoin merged_1-100.tif &lt;/kbd&gt;&lt;br /&gt;
&lt;kbd&gt;convert 0100.tif 0101.tif ... 200.tif -adjoin merged_100-200.tif &lt;/kbd&gt;&lt;br /&gt;
...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Параметрами команды служат названия файлов. В первой группе у нас сто тифов, во всех остальных, кроме последней, сто один тиф, в последней — оставшиеся файлы.&lt;/p&gt;
&lt;p&gt;Для формирования cписка файлов используем цикл, после завершения которого все &lt;abbr&gt;тифы&lt;/abbr&gt; будут объединены в многослоные &lt;abbr&gt;тифы&lt;/abbr&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;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&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Цикл вызывает подпрограмму &lt;kbd&gt;:loop_groups&lt;/kbd&gt;, где и происходит слияние. Подпрограмма принимает номер группы, вычисляет для нее номера первого и последнего файла, формирует список файлов с этими номерами и, в итоге, объединяет их в многослойный &lt;abbr&gt;тиф&lt;/abbr&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;
: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
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Сам список файлов поэлементно строится в подпрограмме &lt;kbd&gt;:loop_files&lt;/kbd&gt;. Она принимает номер файла, дополняет его нулями, добавляет к нему префикс и помещает в конец списка (строки).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;:loop_files
rem Добавляет ведущие нули к индексу файла
set &amp;quot;file_index=0000%1&amp;quot;
set &amp;quot;file_index=%file_index:~-4%&amp;quot;

rem Дополняет файл префиксом
set file_name=%tif_file_prefix%_%file_index%.tif

rem Добавляет название файла в конец списка
set &amp;quot;file_list=%file_list%%file_name% &amp;quot;
	
goto :eof&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Итоговый скрипт&lt;/h3&gt;
&lt;p&gt;Готовый батч-скрипт пробразует &lt;abbr&gt;mov&lt;/abbr&gt; в многослойные &lt;abbr&gt;tiff&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Он использует код из двух заметок и:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;спрашивает название &lt;abbr&gt;мув&lt;/abbr&gt;-файла с видео;&lt;/li&gt;
&lt;li&gt;спрашивает, нужно ли осветлить видео;&lt;/li&gt;
&lt;li&gt;спрашивает название каталога, куда следует поместить многослойные тифы;&lt;/li&gt;
&lt;li&gt;спрашивает, нужно ли удалить тифы с отдельными кадрами после завершения работы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="display:inline-block; background-color:#40BA9B; padding:8px 12px; border-radius:2px"&gt;&lt;a href="/download/?mov-to-tifs" style="color:#fff; font-weight:bold"&gt;Скачать скрипт mov-to-tifs&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:cadetblue"&gt;Скрипт распространяется бесплатно, как есть и может быть запущен на любом количестве машин. Вы соглашаетесь с ипользованием скрипта на свой страх и риск. Автор скрипта не несет ответственности ни за какие сбои, неверную работу, удаление или изменение пользовательских данных.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Для работы скрипта необходимо установить &lt;a href="https://imagemagick.org/"&gt;ImageMagick&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Вопросы, связанные с функционирование скрипта, задавайте в комментариях.&lt;/p&gt;
</description>
</item>


</channel>
</rss>