Благодаря комментариям и ответам Марка Сетчелла и Криса Луенго, я придумала несколько тестов, которые могут показать, что происходит.Вот 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](https://i.stack.imgur.com/MATJt.png)
"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
.