Инструменты запускаются из командной строки Unix, чтобы уменьшить битовую глубину изображений в градациях серого в PDF - PullRequest
0 голосов
/ 26 мая 2018

Мой сканер на рабочем месте создает непомерно большие PDF-файлы из черно-белых изображений рукописных заметок с низким разрешением.В настоящее время я использую Acrobat Pro для извлечения изображений PNG из PDF, затем использую Matlab для уменьшения глубины цвета, а затем использую Acrobat Pro, чтобы объединить их обратно в PDF-файлы.Я могу уменьшить размер файла PDF на один-два порядка.

Но разве это когда-нибудь мучительно?

Я пытаюсь написать для этого сценарии, состоящие из командной строки cygwin.инструменты.Вот один PDF, который был сжат с использованием моей византийской схемы:

$ pdfimages -list bothPNGs.pdf

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     550   558  gray    1   2  image  no        25  0    72    72 6455B 8.4%
   2     1 image     523   519  gray    1   2  image  no         3  0    72    72 5968B 8.8%

Я использовал Matlab, чтобы уменьшить глубину в битах до 2. Чтобы проверить использование инструментов Unix, я повторно извлекаю PNG, используя pdfimages, затем используйте convert для рекомбинации их в PDF, указав при этом битовую глубину:

$ convert -depth 2 sparseDataCube.png asnFEsInTstep.png bothPNGs_convert.pdf
# Results are the same regardless of the presence/absence of `-depth 2`

$ pdfimages -list bothPNGs_convert.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     550   558  gray    1   8  image  no         8  0    72    72 6633B 2.2%
   2     1 image     523   519  gray    1   8  image  no        22  0    72    72 6433B 2.4%

К сожалению, битовая глубина теперь равна 8. Мой аргумент битовой глубины фактически не имеетлюбой эффект.

Каков рекомендуемый способ уменьшения разрядности PNG и рекомбинации в PDF? Какой бы инструмент ни использовался, я хочу избежать фильтрации сглаживания.На нефотографических изображениях это просто вызывает пятнышко по краям текста и линий.

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

Это похоже на еще один похожий вопрос , но мне действительно наплевать на какой-либо альфа-слой.

Вот два файла изображений с битовой глубиной 2, которые я сгенерировал для тестирования:

enter image description here

enter image description here

Вот тесты, основанные на моих начальных (ограниченных) знаниях, а также на рекомендациях респондента Марка:

$ convert -depth 2 test1.png test2.png test_convert.pdf
$ pdfimages -list test_convert.pdf

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3204B  32%
   2     1 image     100   100  gray    1   8  image  no        22  0    72    72 3221B  32%

$ convert -depth 2 test1.png test2.png -define png:color-type=0 -define png:bit-depth=2 test_convert.pdf
$ pdfimages -list test_convert.pdf

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3204B  32%
   2     1 image     100   100  gray    1   8  image  no        22  0    72    72 3221B  32%    

Глубина в битах изображений в созданном файле PDF равна 8 (а не 2, как требуется и указано).

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Благодаря комментариям и ответам Марка Сетчелла и Криса Луенго, я придумала несколько тестов, которые могут показать, что происходит.Вот 2-битные и 8-битные случайные PNG-тесты в градациях серого, созданные с использованием Matlab:

im = uint8( floor( 256*rand(100,100) ) );
imwrite(im,'rnd_b8.png','BitDepth',8);
imwrite(im,'rnd_b2.png','BitDepth',2);

2-битные PNG имеют гораздо меньшую энтропию, чем 8-битные PNG.

Следующие команды оболочки создают PDF-файлы со сжатием и без него:

convert rnd_b2.png rnd_b2.pdf
convert rnd_b2.png -depth 2 rnd_b2_d2.pdf
convert rnd_b2.png -compress LZW rnd_b2_lzw.pdf
convert rnd_b8.png rnd_b8.pdf
convert rnd_b8.png -depth 2 rnd_b8_d2.pdf
convert rnd_b8.png -compress LZW rnd_b8_lzw.pdf

Теперь проверьте размеры файлов, битовую глубину и сжатие (я использую bash):

$ ls -l *.pdf
 8096 rnd_b2.pdf
 8099 rnd_b2_d2.pdf
 7908 rnd_b2_lzw.pdf
22523 rnd_b8.pdf
 8733 rnd_b8_d2.pdf
29697 rnd_b8_lzw.pdf

$ pdfimages -list rnd_b2.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3178B  32%

$ pdfimages -list rnd_b2_d2.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3178B  32%

$ pdfimages -list rnd_b2_lzw.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3084B  31%

$ pdfimages -list rnd_b8.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 9.78K 100%

$ pdfimages -list rnd_b8_d2.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 3116B  31%

$ pdfimages -list rnd_b8_lzw.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     100   100  gray    1   8  image  no         8  0    72    72 13.3K 136%

По существу, convert делаетне создавать PNG с заданной пользователем битовой глубиной для вставки в PDF;он преобразует 2-битные PNG в 8-битные.Это означает, что PDF-файлы, созданные из 2-битных PNG, имеют намного меньшую энтропию, чем максимум для 8-битных изображений.Я подтвердил это, извлекая PNG и подтверждая, что в данных имеется только 4 уровня оттенков серого.

Тот факт, что rnd_b8_d2.pdf сопоставим по размеру с PDF-файлами, созданными из 2-битных PNG, показывает, как convertобрабатывает -depth 2, который предшествует спецификации выходного файла.Кажется, что в какой-то момент уменьшает динамический диапазон до 2 бит, но расширяет его до 8 бит для включения в PDF.

Затем сравните размеры файлов с их коэффициентами сжатия,принимая несжатые 8-битные случайные оттенки серого в качестве базовой линии, то есть rnd_b8.pdf:

rnd_b2.pdf       8096 / 22523 =  36%
rnd_b2_d2.pdf    8099 / 22523 =  36%
rnd_b2_lzw.pdf   7908 / 22523 =  35%
rnd_b8.pdf      22523 / 22523 = 100%
rnd_b8_d2.pdf    8733 / 22523 =  39%
rnd_b8_lzw.pdf  29697 / 22523 = 131%

Кажется, что ratio из pdfimages - это объем пространства, занимаемого изображением, по сравнению с максимумом8-битное энтропийное изображение.

Также кажется, что сжатие выполняется convert независимо от того, указано ли оно в переключателях.Это связано с тем, что rnd_b2*.pdf имеют одинаковый размер и ratio с.

I предполагают , что увеличение на rnd_b8_lzw.pdf на 31% является накладным из-за попыткисжатие, когда сжатие невозможно. Кажется ли это разумным для вас "людей", занимающихся обработкой изображений? (я не специалист по обработке изображений).

Исходя из предположения, что сжатие происходит автоматически, мне не нужен Matlab дляуменьшить динамический диапазон.Спецификация -depth 2 до convert уменьшит динамический диапазон, и даже если изображение в формате PDF имеет размер 8 бит, оно автоматически сжимается, что почти так же эффективно, как и 2-битное изображение.

Есть только одна большая проблема.Согласно приведенной выше логике все следующие файлы должны выглядеть сопоставимыми:

rnd_b2.pdf
rnd_b2_d2.pdf
rnd_b2_lzw.pdf

rnd_b8_d2.pdf

Первые 3 делают, а последние нет.Это тот, который использует спецификацию -depth 2 до convert для уменьшения динамического диапазона.Matlab показывает, что используются только 4 уровня градаций серого от 0 до 255, но два средних уровня встречаются в два раза чаще, чем граничные уровни.Используя -depth 4, я обнаружил, что только минимальный и максимальный уровни оттенков серого всегда являются половиной равномерного распределения среди всех других уровней оттенков серого.Причина этого стала очевидной, когда я нанес на карту отображение уровней серого в rnd_b8.pdf по сравнению с 4-битным аналогом глубины:

enter image description here

"bins "8-битных значений уровня серого, которые соответствуют минимальному и максимальному 4-битным уровням серого, в два раза меньше, чем для других 4-битных уровней серого.Это может быть потому, что ячейки определены симметрично, так что (например) значения, которые отображаются в ноль, включают в себя отрицательные и положительные значения.Это приводит к напрасной трате половины контейнера, поскольку он находится за пределами диапазона входных данных.

Вывод заключается в том, что можно использовать спецификацию -depth для convert, но для небольших битовых глубин этоне идеально, потому что это не максимизирует информацию в битах.

AFTERNOTE: И интересный положительный эффект, который я наблюдал, что очевидно в ретроспективе, особенно в свете комментария Криса Луенго.Если изображения в PDF действительно имеют ограниченную битовую глубину, например, 4 бита, то вы можете извлечь их с помощью pdfimages и повторно упаковать их в PDF, не слишком заботясь об указании правильных -depth.При переупаковке в PDF я заметил, что результат -depth 5 и -depth 6 не увеличил размер файла PDF значительно по сравнению с -depth 4, потому что сжатие по умолчанию сжимает все пустое пространство в 8-битном изображении в пределахPDF.Субъективно качество остается прежним.Однако, если я укажу -depth 3 или ниже, размер файла PDF будет заметно уменьшаться, а качество заметно снизится.

Дополнительные полезные замечания: По истечении большей части годаМне нужно было снова упаковать отсканированные файлы в файл PDF, но на этот раз я использовал сканер, который создавал файлы PNG для каждой страницы.У меня не было желания тратить время, потраченное выше, на обратное проектирование поведения инструментов ImageMagick.Не увязая в сорняках, я смог заметить три полезных идиоматических подробности кода, по крайней мере для меня, и я надеюсь, что это поможет кому-то еще.Для контекста предположим, что вы хотите уменьшить глубину оттенков серого до 2 бит, что позволяет использовать 4 уровня.Я обнаружил, что этого достаточно для отсканированных текстовых документов с незначительной потерей читабельности.

Во-первых, , если вы сканировали, скажем, в оттенках серого с разрешением 200 т / д и хотите уменьшить до 2 битВам необходимо указать -density до для первого (входного) файла: convert -density 200x200 -depth 2 input.png output.pdf.В противном случае получается очень грубое разрешение, хотя pdfimage -list показывает 200x200. Во-вторых, вы хотите использовать один оператор преобразования для преобразования коллекции файлов PNG в один PDF-файл с ограниченной глубиной.Я узнал об этом, потому что сначала convert отредактировал несколько файлов PNG в один файл PDF, затем converted до глубины 2. Размер файла уменьшается, но не так сильно, как мог бы.На самом деле, если у меня был только 1 входной файл, размер фактически увеличился на треть.Таким образом, идеальный образец для меня был convert -density 200x200 -depth 2 input1.png input2.png output.pdf. В-третьих, документы, сканируемые вручную по одной странице за раз, часто нуждаются в корректировке поворота страницы, и при поиске в Интернете рекомендуется использовать pdftk вместо (скажем) convert (хорошо обсуждено здесь ).Обоснование состоит в том, что convert растеризуется.Несмотря на то, что сканы растеризованы, я решил использовать pdftk, чтобы избежать возможности повторной растрирования и связанной с этим возможности ухудшения точности.pdfjam может также хорошо работать, но начальные шаблоны кода для поворотов для конкретной страницы уже были указаны для pdftk.Из экспериментов, образец для меня был (скажем) pdftk input.pdf cat 1west 2east 3east output output.pdf.

0 голосов
/ 26 мая 2018

Обновленный ответ

Я все еще смотрю на это.Одна вещь, которую я заметил, заключается в том, что при написании PDF-файлов она, похоже, учитывает сжатие ...

# Without compression
convert -depth 2 -size 1024x768 gradient: a.pdf
pdfimages -list a.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1     0 image    1024   768  gray    1   8  image  no         8  0    72    72 12.1K 1.6%

# With compression
convert -depth 2 -size 1024x768 gradient: -compress lzw a.pdf
pdfimages -list a.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    1024   768  gray    1   8  image  no         8  0    72    72 3360B 0.4%

Вы можете перечислить доступные типы сжатия с помощью:

identify -list compress

Кажется, чтоПримите следующее для вывода PDF:

  • JPEG
  • LZW
  • ZIP

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

Первоначальный ответ

Пожалуйста, попробуйте добавить:

-define png:bit-depth=2

и / или

-define png:color-type=X

, где X - это либо 0 (в оттенках серого), либо 3 (индексированный, то есть в виде палитры)

Так, в частности:

convert image1.png image2.png -define <AS ABOVE> output.pdf
...