将图像分解为更好的可压缩组件

信息处理 图像处理 压缩 分解
2022-02-10 21:00:41

我们的团队开发了一个应用程序,该应用程序在某些功能上连接到扫描仪(通过 TWAIN 或 WIA)并扫描文档,并从中生成 PDF 文件。该应用程序主要用于处理带有少量图像的邮件或文档。

我们最近注意到,尽管使用了类似的扫描仪参数(分辨率、颜色等),但我们的应用程序生成的 PDF 文件(就文件大小而言)是扫描仪软件生成的文件的四倍。

所以我深入研究了生成的pdf文件,这就是我得到的:

  • 通过 MuPDF 组件mutool.exe,我获得了有关 PDF 内对象的信息:

    • 我们的 PDF 包含一张图像(不足为奇,它直接来自扫描结果):

      [ DCT ]      3302x4668 8bpc DevRGB
      
    • 扫描仪软件生成的 PDF 文件包含两个图像(啊哈!这更令人惊讶),它们的大小不同,并且没有相同的颜色配置文件:

      [ DCT ]      1650x2334 8bpc DevRGB
      [ CCITTFax ] 3176x4512 1bpc ImageMask
      
  • 仍然使用mutool,我从扫描仪软件生成的PDF中提取了两张图片:
    • 第一张图片是我们可以称之为“背景”的东西:这是它的缩略图,以及 100% 尺寸的细节:
      缩略图 细节
    • 第二张图像是纯黑白(每像素 1 位)图层,大部分为黑色;这是 100% 尺寸的细节:
      在此处输入图像描述

因此,扫描仪随附的软件似乎使用了一种算法,该算法检测到文档大部分是黑白的,然后将图像分解为重叠的两部分;第一部分包含可以下采样的小细节(因此占用更少的空间),第二部分仅包含黑色或白色点,可以实现更好的压缩。

我的问题是:我们怎样才能做类似的事情?

谢谢

1个回答

假设图像是灰度级(不是彩色)

  1. 使用 Otsu 的阈值方法来检测图像是否具有双模直方图。
  2. 如果 Otsu 非常自信地告诉您图像是双模态的,请使用它给您的阈值来对图像进行二值化。那是您的二进制掩码,可以有效地打包成位。
  3. 找到两个直方图模式的灰度值,创建一个蒙版,其中“白色”是第二个模式的灰度值,“黑色”是第一个模式的值。
  4. 从图像中减去先前制作的蒙版。这些是您可以使用有损压缩来压缩的小改动。
  5. 将两种模式与文档一起保存为两个整数。