Пакетная операция Imagemagick в зависимости от размера файла - Как?
Я бегу Imagemagick
в командной строке терминала Ubuntu в Windows 10 - используя встроенное средство в Windows 10 - приложение Ubuntu.
Я новичок в Linux, но я установил imagemagick
в вышеуказанной среде.
Моя задача - автоматически удалить черную (ish) рамку и выровнять изображения тысяч отсканированных 35-миллиметровых слайдов.
Я могу успешно запустить такие команды, как
mogrify -fuzz 35% -deskew 80% -trim +repage *.tif
Проблема в:-
- Граница не четко определена и не является полностью черной, следовательно, -fuzz. Некоторые изображения обрезаются при определенном размытии, а другие - недостаточно.
Итак, что я хочу сделать, это сделать два прохода с разными процентами неопределенности по следующим причинам:
- 1-й проход с низким Fuzz%. Многие изображения не будут обрезаться вообще, но я обнаружил, что те, которые подвержены чрезмерной обрезке, будут обрезаться Хорошо с низким%
- Поскольку все изображения начинаются с одинакового размера файла, те, которые обрезаны Ok, будут иметь меньший размер файла (обратите внимание, что это tifs, а не jpgs)
- Итак, что мне нужно сделать, это установить условие размера файла для второго прохода с более высокой неопределенностью%, что игнорирует размеры файла ниже определенного значения и не выполняет никаких операций.
Таким образом, с небольшими ошибками все изображения будут правильно обрезаны.
Таким образом, вопрос - Как я могу настроить командную строку, чтобы иметь 2 прохода и игнорировать меньший размер файла на втором проходе?
У меня ужасное чувство, что ответом будет сценарий. Я понятия не имею, как создать или настроить Ubuntu для запуска, так что если это так, пожалуйста, вы можете указать мне, чтобы помочь в этом тоже!
1 ответ
В ImageMagick вы можете сделать что-то вроде следующего:
Получить размер входного файла
Use convert to deskew and trim.
Then find the new file
Then compare the new to the old to compute the percentdifference to some percent threshold
If the percent difference is less than some threshold, then the processing did not trim enough
So reprocess with a higher fuzz value and write over the input; otherwise keep the first one only and do not write over the old one.
Синтаксис Unix.
Выберите два значения fuzz
Выберите порог изменения процента
Создайте новый пустой каталог для хранения результатов (результатов)
cd
cd desktop/Originals
fuzz1=20
fuzz2=40
threshpct=10
list=`ls`
for img in $list; do
filesize=`convert -ping $img -precision 16 -format "%b" info: | sed 's/[B]*$//'`
echo "filesize=$filesize"
convert $img -background black -deskew 40% -fuzz $fuzz1% ../results/$img
newfilesize=`convert -ping ../results/$img -precision 16 -format "%b" info: | sed 's/[B]*$//'`
test=`convert xc: -format "%[fx:100*($filesize-$newfilesize)/$filesize<$threshpct?1:0]" info:`
echo "newfilesize=$newfilesize; test=$test;"
[ $test -eq 1 ] && convert $img -background black -deskew 40% -fuzz $fuzz2% ../results/$img
done
Проблема заключается в том, что вы должны быть уверены, что вы установили сжатие TIFF для выходных данных так же, как и для входных данных, чтобы размеры файлов были эквивалентны, и, предположительно, новый размер не больше старого, как это происходит с JPG.
Обратите внимание, что sed используется для удаления буквы B (байтов) из размера файла, поэтому их можно сравнивать как цифры, а не как строки. -Precision 16 заставляет "%b" сообщать как B, а не как КБ или МБ.