压缩和增强手写笔记(2016)

2021-04-12 14:04:41

我写了一个程序来清理手写笔记的扫描,同时减少文件大小。

左:输入扫描@ 300 DPI,7.2MB PNG / 790KB JPG。右:输出@相同分辨率,121KB PNG。 1

免责声明:此处描述的过程或多或少是办公室镜头应用程序已经是什么,并且可能有任何其他工具可以做类似的事情。我并不声称是一个激进的新发明 - 只是我自己实现了一个usefulto。

如果您赶快,只需查看GitHub repo,或跳下来看结果部分,您可以在那里播放彩色群集的交氮机3D图。

我的一些课程没有分配的教科书。为此,我将每周任命每周“学生抄写”分享他们的课程讲义,以便有一些善意的书面资源,以便仔细检查他们对材料的理解。 Thenotes已作为PDF发布到课程网站。

在学校,我们有一个能够扫描PDF的“聪明的”复印机,但它产生的榴景是少于吸引力。这是来自手写的作业页面的一些embileOutput:

似乎随意,复印机选择是否编写了每个标记(如x的),或将它们转换为深度块状的jpgs(喜欢方形根符号)。不用说,我们可以做得更好。

我们开始扫描一张可爱的学生笔记:

在300 dpi扫描的原始PNG图像约为7.2MB;在质量级别85处转换为JPG的同位约为790KB。 2,因为扫描的PNGor JNGOR JNGOR的集装箱格式,我们当然不希望在转换到PDF时减少所需的存储。每页800KB是非常合理的 - 为了加载时代,我很乐意看到越来越近100KB /页面的东西。 3.

虽然这个学生是一个非常简洁的音符,但扫描显示了abovelooks有点凌乱(通过自己的没有错)。与恒定颜色的背景相比,从页面的另一侧均来自页面的另一侧,这对观众来说既又为jpg或png编码器难以计算出来。

这是一个相对微小的PNG文件,在121KB中称重。我最喜欢的部分?不仅图像变小了,它也很清晰!

通过从前台选择少量的“代表颜色”来转换为索引的颜色PNG。

在我们进入这些步骤中的每一个步骤之前,它可能是有用的torecap如何数字存储彩色图像。因为人类在眼睛里有不同类型的色彩敏感细胞,我们通过组合红色,绿色和蓝光的各种强度来调节任何颜色。 4所产生的系统将带有RGB颜色空间中的3DPoints的颜色等于3DPoints:5

尽管真正的矢量空间将允许无限数量的不同变化的像素强度,但是我们需要将Colorsin命令分开以数字方式存储它们 - 通常分配8位,每个都是红色,绿色和蓝色通道。尽管如此,考虑到类似图像的形象,类似于在连续的3D空间提供的指向AWERFULFORMFORFULFORFUL工具进行分析,因为我们将看到我们逐步浏览上面概述的过程。

由于这些页面的大多数都没有墨水或线条,我们将纸张颜色成为扫描图像最常见的纸张颜色 - 如果扫描仪始终将每位的白皮书表示为同一RGB三联网,我们将拥有noproples挑选出来。令人遗憾的是,这不是这种情况;由于灰尘斑点和墨镜上的污迹,页面本身的颜色变化,传感器噪声等所以非常感光,“页面颜色”可以分布在数千个DistinctRGB值中的颜色变化。

原始扫描图像为2,081 x 2,531,总面积为5,267,011像素。虽然我们可以考虑每个像素,但在InputImage的代表性样本上工作要快得多。 NoteShrink.py程序样本5%的输入图像ByDefault(超过300 dpi的扫描足够超过足够的扫描),但现在让我们看一下在Oractwom的10,000像素的甚至更小的子集原始扫描:

虽然它与实际的扫描页面具有很少的相似性 - 但没有找到文本 - 两解的颜色分布几乎相同。两者都是灰白色的,具有一种红色,蓝色和深灰色像素。这里是相同的10,000像素,由亮度排序(例如,它们的R,G和所述至少款):

从远处观看,底部80-90%的图像似乎是Chesame的颜色;然而,仔细检查揭示了相当多的变化。事实上,上述图像中最常见的颜色,具有RGB值(240,240,242),仅占10,000个样本的226个 - LakeThan总数的3%像素。

由于此处的模式占这些少量的这种百分比,因此应该质疑如何可靠地描述图像中的颜色分布。如果我们首先缩小图像的位深度,我们将有更好的机会识别Aprevalent页面颜色。以下是当我们通过归零四个最低有效位时,当我们每频道移动到4时,我们将在每频道8位移动到4

现在,最频繁发生的颜色具有RGB值(224,224,224),并且占采样像素的3,623(36%)。基本上,缩制了比特深度,我们正在将类似的像素分组为更大的“垃圾箱”,这使得更容易在数据中找到强大的峰值。 6.

在可靠性和精度之间存在以下权衡:小型禁止粮食的颜色较大,但更大的垃圾箱是多么愚蠢。最后,我的每条通道一起使用了6位,以识别Backgreground颜色,这似乎是两种良好的两种良好的甜蜜点。

一旦我们识别了背景颜色,我们就可以根据图像中的每个像素的相似如何阈值。计算两种颜色的相似性的不良方式是在RGB空间中计算它们坐标的欧几里德距离;但是,这种简单的方法无法正确分割如下所示的颜色:

以下是从背景颜色的颜色及其欧几里德距离的表:

正如您所看到的那样,暗灰色的流血之限,我们希望通过背景为背景进一步远离白色的PageColor,而不是我们希望撰写Shoreground。欧几里德距离的任何阈值,标志着粉红色的距离,必然必须包括渗透到通风。

我们可以通过从RGB空间转移到Hue-Sization-Value(HSV)空间来解决这个问题,这使RGB Cubeinto变形了这个剖视图中所示的圆柱形状:7

HSV气缸采用彩虹的彩虹,其外部顶部边缘分布圆形;色调是指沿着Thiscircle的角度。圆筒的中心轴线在顶部的顶部从黑色到白色,之间的灰色阴影 - 此Entrereaxis具有零饱和度,或颜色强度,并且鲜明的HUESON外部围绕的饱和度为1.0。最后,价值是指颜色的整体亮度,从顶部的底部到明亮的阴影范围内。

所以现在让我们重新考虑我们上面的颜色,这次估值饱和度:

正如您所希望的那样,白色,黑色和灰色变化显着依差,但享有类似的低饱和度水平 - 粗糙或粉红色。通过HSV提供的附加信息,我们可以成功标记为属于前台的像素,如果其中一个标准保持其中一个标准:

前标准拉动在黑色笔标记中,而红色墨水中的后壳以及粉红色线。这两个条件都是从前台排除灰色漏血。不同的图像可能需要不同的饱和/值阈值;有关详细信息,请参阅结果部分。

一旦我们隔离前景,我们就会留下一组与页面上标记的一组相应的颜色。让我们来敏感集合 - 但是,但是将颜色视为像素的集合,而是将它们视为RGB ColorSpace中的3D点。结果显示屏最终看起来非常“Clumpy”,有几种乐队的颜色:

我们现在的目标是通过选择颜色的少数(8,在本示例中)来代表整个图像来将原始24位按像素图像转换为索引的彩色图像。这有两个效果:首先,它减少了文件大小,因为指定颜色现在只需要3位(因为\(8 = 2 ^ 3 \))。此外,它使得产生的Imagemore在视觉上凝聚力,因为类似地彩墨标记可能在最终输出图像中被分配相同的颜色。

为了完成此目标,我们将使用数据驱动方法Thatexploits上图“Clumpy”性质。选择Colorsthat对应于群集的中心将威尔将一组精确代表底层的颜色。在技​​术方面,我们通过使用集群分析,我们将解决颜色量化问题(这本身就是向量量化的特殊情况)。

我挑选的工作的特定方法工具是k均值聚类。其总体目标是找到一组框架或中心,最小化每个点到最近的中心的平均距离。在这里使用它在上面的数据集中选择Outseven不同的群集时,您可以获得什么:8

在此图中,具有黑色轮廓的点代表前景颜色样本,并且彩色线将它们连接到RGB ColorSpace中的级别中心。当图像被转换为​​索引彩色时,每个前景样本都将被替换为CheClosest Center的颜色。最后,循环轮廓表明每个中心的距离是其最远的相关样本。

除了能够设置值和饱和度阈值之外,NoteShrink.py程序有几个其他值得注意的功能。 ByDefault,它可以分别增加最终粉碎的鲜艳度和对比度,分别重新加入最小和最大强度值至0和255。如果没有这种调整,那么上面的8色调色板将如下所示:

还有一个选择在前景颜色后迫使背景颜色到白色。为了进一步减少转换成索引的PNG镜片,NoteShrink.py Canautomicogy运行PNG优化工具,如Optipng,PNGCrush或PngQuant。

该程序的最终输出将多个输出图像组合使用ImageMagick的转换工具如此。作为AFURETHER BOOLUS,NOTESHRINK.PY会自动对输入FILENAMESNUMERALLY(如字母顺序排列),因为shell globingoperator do)。当您的愚蠢扫描程序9使输出文件名如扫描9.png和扫描10.png时,这很有帮助,并且您可以在PDF中交换他们的订单。

以下是程序输出的一些示例。第一个(PDF)看起来很棒,默认的设置:

下一个(PDF)所需将饱和阈值降低到0.045,因为蓝灰线是SODRAB:

最后,从工程师的图纸(PDF)中扫描了一个示例。对于此,ISET值阈值为0.05,因为靠背和线之间的对比度如此之低:

一切都在一起,四个PDF占据约788KB,平均每页约为130KB的输出。

我很高兴能够生产一种实用的工具,我可以使用Toprepare Scribe注意我的课程网站的PDF。除此之外,我真的很好地准备了这个写作,特别是因为它因为它驯服了我在西非菲尼亚颜色量化页面上显示的基本上2d的可视化上提高了我,而且还要最终学习三个.js(非常有趣,会再次使用)。

如果我曾经重新审视这个项目,我想在替代量化方案附近玩。在我这个周刊上发生的一个是在一组颜色样本的最近邻图上使用频谱聚类 - 我认为这是一个令人兴奋的新想法,当一个令人兴奋的新想法,但事实证明,有一个2012纸提出了这一方法。那好吧。

您还可以尝试使用期望最大化,以形成描述颜色分布的高斯混合模型 - 不确定,过去已经做得很大。其他有趣的想法包括尝试排出一个“感知统一”的色彩空间,如L * A * B *到群集,Andalso试图自动确定给定图像的“最佳”群集数。

另一方面,我有一个积压的博客条目来推出托管,所以我现在要在这个项目中放一个PIN,并邀请您去判断NoteShrink.py Github存储库。直到下一次!

在那里,我可以' t运行程序,它给了我这个输出,我可以用自己解决问题,我跳debian jessie ...... i' m使用一个来自此网页的图像。回溯:$ notellink / home/lordford/downloads/notesa1.jpg打开/home/lordford/downloads/notesa1.jpg获取调色板......回溯(最近呼叫最后):文件" / usr / local / bin / notellink",第9行,在<模块> load_entry_point(' notellink == 0.1.0'' console_scripts&#39 ;,' notellink')()文件" build / bdist.linux-x86_64 / eg / noteShrink.py",第582行,在主文件" build / bdist.linux-x86_64 / emp / notshrink.py",第558行,在NoteScan_main文件" build / bdist.linux -x86_64 / egal / noteShrink.py",行381,在get_palette文件" build / bdist.linux-x86_64 / emp / notshrink.py"行106,在get_bg_color typearror中:unique()get一个意外的关键字参数' return_counts'

是的,我没有意识到return_counts是numpy.unique最近添加的选项。您需要Numpy 1.10或更大才能运行脚本。我在repo中更新了该要求。但是我没有递增我的版本号并重新上传到Pypi,工作......

它应该适用于您可以安装Python的任何系统以及包括窗口的要求。

祝贺有趣的软件和非常清晰的写作,以非常可理解的方式显示非琐碎的算​​法。谢谢你。

你好!谢谢你提供这个工具。我试图使它与Python 2.7一起工作,但是,在成功安装所需的包后,我收到以下错误:"运行pdf命令"转换page0000.png output.pdf" ...&# 34; "警告:PDF命令失败"只生成PNG。你知道什么都没有什么?提前致谢!

是的,看起来没有安装imageMagick软件。请参阅http://www.imagemagick.org/scr ...或使用通常的包管理器(apt-get / macports / homebrew / etc。)来安装它。

嗨,谢谢这个工具。我想知道是否可以转换PDF文件。

我一直试图将我的pdf' s为png,但质量不是最好的,所以最终输出没有最好的分辨率。

亲爱的Matt,来自德国论坛的用户问我/社区如果有人会为你的NoteShrinker创建一个GUI ...(另外到基于Django存在的Django)。因此,如果可能的话,我会通过电子邮件与您联系,如果有可能并希望它将是开源并在Github上托管......)希望由于此评论而您可以看到我的邮件地址......关于马蒂亚斯

嗨Matthias - 软件开放,具有非常宽容的许可证。在那里没有什么能阻止任何人捡起它,做出几乎他们的任何东西。我没有时间支持一个GUI的发展,但我鼓励你和你的论坛成员去!

嘿马特,谢谢你的快速回复!当然,我们将照顾GUI的发展;-)应该需要从您身边的支持......您的程序员呈良好的形状和结构。我只是想确定并要求你的许可(在麻省理工学院许可证旁边):-d也许在几个星期/月(?)上,这取决于我可以花费我的时间和#39; LL再次与您联系,只是让你知道完成GUI的GitHub repo!谢谢到目前为止,来自德国的最佳问候,马蒂亚斯

嗨马特,如果你想看看它,你可以找到第一个alpha - > https://github.com/acer54/note ...用于赢取用户,有一个zip文件,所有依赖项都有......对于Linux和Mac只有源代码可用。看看发行说明,也可以改变一些改变,例如,用QT4 Libs替换PIL和ImageMagick。问候,马蒂亚斯

不,我想它可能工作只要命令行参数到'转换' Haven' T已经改变太多了......

手写笔记样本呈上学生Ursula Monaghan和John Larkin的慷慨许可。 ↩

这里所示的图像实际上将缩小到150 dpi,以允许页面更快地加载。 ↩

我们复印机确实很好的一件事是保持PDF尺寸 - 它有关这些类型的文档约为50-75 kB /页面。 ↩

这使得红色,绿色和蓝色添加原色。您的小学艺术老师可能会告诉您,原色是红色,黄色和蓝色。这是个谎言;但是,有三种减法原色:青色,黄色和洋红色。添加剂初值涉及组合光(这是发射的监测器),而那些减子涉及在油墨和染料中发现的组合色素。 ↩

查看Wikipedia的直方图文章中的“提示”示例,以为为什么增加箱尺寸有助于帮助。 ↩

为什么k = 7而不是8? 我们想要最终图像中的8种颜色,我们已经确定了背景颜色......↩