【问题标题】:Tools run from unix command line to decrease bit depth of grayscale images in PDFs工具从 unix 命令行运行以减少 PDF 中灰度图像的位深度
【发布时间】:2019-03-26 12:25:46
【问题描述】:

我的工作场所扫描仪通过对手写笔记的低分辨率灰度扫描创建非常大的 PDF。我目前使用 Acrobat Pro 从 PDF 中提取 PNG 图像,然后使用 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 工具的使用,我使用 pdfimages 重新提取 PNG,然后使用 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 软件包都是成问题的。我在一个非常受控的环境中工作,升级并不容易。

这看起来像another similar sounding question,但我真的不关心任何 alpha 层。

这是我为测试生成的两个位深为 2 的图像文件:

以下是基于我最初(有限)知识以及受访者 Mark 的建议的测试:

$ 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,根据需要和指定)。

【问题讨论】:

  • 什么是“Adobe Pro”?我过去一直是 Adob​​e 开发人员,从未听说过这样的产品。有链接吗?
  • 实际上是Adobe Acrobat Pro。我会修改原帖。
  • 不禁注意到反对票。一点解释会有所帮助(无论是谁做的)。谢谢。
  • 不知道我明白你为什么关心... a) 存储很便宜而且越来越便宜 b) 你的示例中的文件都在 6,000 字节左右,那么为什么要关心它们是 2bpc 还是 8bpc?
  • 这些是微不足道的文件。个人而言,我不在乎。累积起来,它们会产生很大的不同,特别是如果对大大小小的文件进行常规扫描(现在的目标是无纸化办公室)。此外,通过常规将文档附加到电子邮件中,对电子邮件客户端文件的影响会更加严重。对于我用来寻找解决方案的小例子,最初创建的 PDF 是数百 KB,而我重新创建的 PDF 是几个 KB。

标签: image-processing


【解决方案1】:

更新答案

我还在看这个。我注意到的一件事是,它在编写 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
  • 邮编

请注意,您的测试图像没有达到很好的压缩效果,但话又说回来,请考虑它们在您的文档中的真正代表性 - 它们看起来非常随机,而且这些东西总是压缩得很差。

初步回答

请尝试添加:

-define png:bit-depth=2

和/或

-define png:color-type=X

其中X 为 0(灰度)或 3(索引,即调色板)

所以,具体来说:

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

【讨论】:

  • 感谢您的尝试,马克。 convert -list 的结果不会因为将命令行开关指定为 convert 命令以将 PNG 合并到 PDF 中而改变。我尝试将它们定位为如上所示以及主要论点的位置。 (我还在我的原始帖子中尝试了 depth 参数的这种不同位置。)对于这两个变化中的每一个,我进一步交替了你的 -define png:color-type=X 在 X=0 和 X=3 之间。对于参数的两种定位,我也尝试不定义 color-type 参数。
  • 在哪里可以找到关于 gradient: 规范到 compress 的文档?它不会出现在 man 页面中。谢谢...
  • -gradient: 只是生成一个渐变 - 在这种情况下从黑色到白色来制作一些测试数据。它与-compress 无关。您可以尝试convert -size 1024x768 gradient: result.png,然后在输出文件名之前使用-depth 2
  • 嗯,好的。我希望找到有关所有这些关键字的文档。我通常依赖于一切都在手册页中的事实,无论多么难以理解。我注意到compression-compress 规范视为不区分大小写(我使用identify -list compress 中的大小写)。
  • 我对没有compress 的1.6% 的ratio 和使用LZW 的0.4% 感到困惑。它不应该更高吗?同样,我一直在检查compresspdfimages ratio。我在原始帖子下将其捕获为 cmets。坦率地说,我不确定结果是什么,因此,convertcompresspdfimagesratio
【解决方案2】:

感谢 Mark Setchell 和 Cris Luengo 的 cmets 和答案,我提出了一些可能揭示正在发生的事情的测试。以下是使用 Matlab 创建的 2 位和 8 位随机灰度测试 PNG:

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 少得多。

以下 shell 命令创建带压缩和不带压缩的 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 位。这意味着从 2 位 PNG 创建的 PDF 的熵远小于 8 位图像的最大熵。我通过提取 PNG 并确认数据中只有 4 个灰度级来确认这一点。

rnd_b8_d2.pdf 在大小上与从 2 位 PNG 创建的 PDF 相当这一事实揭示了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%

似乎pdfimages 中的ratio 是图像与最大熵 8 位图像相比所占用的空间量。

似乎压缩是由convert 完成的,无论它是否在开关中指定。这是因为rnd_b2*.pdf 的大小和ratios 都相似。

假设rnd_b8_lzw.pdf 增加 31% 是开销,因为在无法压缩时尝试压缩。 这对“你”图像处理人员来说是否合理?(我不是图像处理人员)。

基于压缩自动发生的假设,我不需要 Matlab 来减小动态范围。 -depth 2convert 的规范会降低动态范围,即使图像在 PDF 中为 8 位,它也会被自动压缩,这几乎与 2 位图像一样有效。

只有一个大问题。按照上面的逻辑,下面的文件应该都可以比较:

rnd_b2.pdf
rnd_b2_d2.pdf
rnd_b2_lzw.pdf

rnd_b8_d2.pdf

前 3 个可以,但最后一个不会。它是依赖-depth 2 规范到convert 来减小动态范围的一种。 Matlab 显示从 0 到 255 只使用了 4 个灰度级别,但中间两个级别的出现频率是边缘级别的两倍。使用-depth 4,我发现只有最小和最大灰度级别始终是所有其他灰度级别中均匀分布的一半。当我将rnd_b8.pdf 中的灰度映射与 4 位深度对应物进行比较时,其原因变得显而易见:

映射到最小和最大 4 位灰度级的 8 位灰度级值的“bins”是其他 4 位灰度级宽度的一半。这可能是因为 bin 是对称定义的,因此(例如)映射到零的值包括负值和正值。这浪费了一半的 bin,因为它超出了输入数据的范围。

结论是可以将-depth 规范用于convert,但对于较小的位深度,它并不理想,因为它不会最大化位中的信息。

后注:我观察到的有趣的有益效果,事后看来是显而易见的,尤其是根据 Cris Luengo 的评论。如果 PDF 中的图像确实具有有限的位深度,例如 4 位,那么您可以使用 pdfimages 提取它们并将它们重新打包为 PDF,而无需过多担心指定正确的 -depth。在重新打包成 PDF 时,我注意到 -depth 5-depth 6 的结果并没有比 -depth 4 增加太多的 PDF 文件大小,因为默认压缩会挤出在 8 位图像中浪费的任何空间PDF格式。主观上,质量也保持不变。但是,如果我指定-depth 3 或更低,PDF 文件的大小会明显减小,质量也会明显下降。

更多有用的观察:一年的大部分时间后,我需要再次将扫描的文件打包成 PDF 文件,但这一次,我使用了一个扫描仪,为每个文件创建了 PNG 文件页。我不想重新花费上述时间来对 ImageMagick 工具的行为进行逆向工程。至少对我而言,我能够注意到三个有用的代码习语细节,并没有陷入困境,我希望它对其他人有所帮助。对于上下文,假设您要将灰度深度降级为 2 位,这允许 4 个级别。我发现这对于扫描的文本文档来说已经足够了,可读性损失可以忽略不计。

首先,如果您以(例如)200 dpi 灰度进行扫描,并且想要降级到 2 位,则需要在第一个之前指定 -density之前 (输入)文件:convert -density 200x200 -depth 2 input.png output.pdf。不这样做会产生极其粗糙的分辨率,即使pdfimage -list 显示为 200x200。 第二,您想使用一个转换语句将一组 PNG 文件转换为单个深度受限的 PDF 文件。我发现了这一点,因为我最初将多个 PNG 文件 converted 到一个 PDF 文件中,然后 converted 到 2 的深度。文件大小缩小了,但几乎没有缩小。事实上,如果当我只有一个输入文件时,大小实际上增加了三分之一。所以对我来说理想的模式是convert -density 200x200 -depth 2 input1.png input2.png output.pdf第三, 手动一次扫描一页的文档通常需要调整页面旋转,并且网络搜索会产生使用pdftk 而不是(比如)convert 的建议(很好地讨论了here)。基本原理是convert 光栅化。即使扫描被光栅化,我还是选择使用pdftk 来避免重新光栅化的可能性以及相关的保真度下降的可能性。 pdfjam 也可能做得很好,但已经为 pdftk 提供了针对特定页面旋转的起始代码模式。根据实验,我的模式是(比如)pdftk input.pdf cat 1west 2east 3east output output.pdf

【讨论】:

  • 你肯定是正确的,两端的箱子更窄 - 你可以从我回答的第一个命令中看到。我仍然不确定测试随机图像的压缩是一个很好的测试。最初您想要解决的问题是您的扫描文件过大 - 所以,真正的测试当然是参数如何影响您的扫描图像...
  • 至于使用随机灰度 PNG,我并不是说压缩是扫描文档的代表。我只是想弄清楚convert 在做什么以及如何解释pdfimages 信息表。基于此,我现在对将它们用于其他文档有多大的信心。我将密切关注尺寸和主观图像质量,看看证据是否与我推测的其运作的心理模型有很大的不同。
  • 至于看到渐变图像中灰度级别的奇怪子采样,我确实注意到您的渐变具有较小的白色和黑色极端。在弄清楚 convert 对灰度级别的奇怪二次采样之后,我没有想到回头并理解它。鉴于您对随机灰度测试图像的非代表性,我开始更好地理解梯度图像的使用。我不确定梯度中有多少熵,但它可能比扫描文档的典型熵更接近。
  • 请注意,我对熵的理解充其量是有限的,不适用于图像处理、压缩或加密。它基于三年级本科EE。我知道它是基于概率的,因此受灰度级像素分布的影响。我不知道它是否因梯度中明显的确定性空间模式、附近像素之间的相关性以及光谱能量向低空间频率的偏斜而减少。我从来没有想过 2D Fourier Transforms。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多