Пакетная операция Imagemagick зависит от размера файла - Как? - PullRequest
0 голосов
/ 11 июня 2018

Я использую Imagemagick на терминале Ubuntu в командной строке в Windows 10 - используя встроенное средство Windows 10 - приложение Ubuntu.

Я новичок в Linux, но установил imagemagick в вышеуказанной среде.

Моя задача - автоматически удалить черную (ish) границу и выровнять изображения тысяч отсканированных 35-миллиметровых слайдов.

Я могу успешно запускать такие команды, как

mogrify -fuzz 35% -deskew 80% -trim +repage *.tif

Проблема в том, что: -

  • Граница не имеет четкого определения и не полностью черная, следовательно, -fuzz.Некоторые изображения обрезаются при определенном размытии, в то время как другие обрезаются недостаточно.

Итак, я хочу сделать два прохода с различным процентом размытия по следующим причинам:-

  • 1-й проход с низким Fuzz%.Многие изображения не будут обрезаться вообще, но я обнаружил, что те, которые подвержены чрезмерной обрезке, будут обрезаться Хорошо с низким%
  • Так как все изображения начинаются с одинакового размера файла, те, которые обрезаны Хорошобудет иметь меньший размер файла (обратите внимание, что это tifs, а не jpgs)
  • Так что мне нужно сделать, это установить условие размера файла для второго прохода на более высокий fuzz%, что игнорирует размеры файлов ниже определенного значения и невыполните любую операцию.

Таким образом, с небольшими ошибками все изображения будут корректно обрезаны.

Итак, вопрос - Как настроить командную строку, чтобы иметь 2 прохода?и игнорировать меньший размер файла на втором проходе?

У меня ужасное чувство, что ответом будет сценарий.Я понятия не имею, как создать или настроить Ubuntu для запуска, так что если это так, пожалуйста, вы можете указать мне, чтобы помочь в этом тоже !!

1 Ответ

0 голосов
/ 12 июня 2018

В 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, а не как КБ или МБ.

...