上边这张照片不是异形,而是著名的鹦鹉螺。下边这张照片,是送给研究生同学的毕业纪念,向龙同学帮我激光雕刻的。

近期的照片在[http://www.douban.com/photos/album/134230762/].

电子书扫描版跟照片差点儿相同,一个可能的问题是看起来乌突突的,黑的不够黑,白的不够白,像是蒙了一层雾。用picasa的luck功能或者snapseed的automatic功能,都能把图片上的雾去掉。可是相同的功能用在PDF上的软件我没有找到。

可是假设弄懂了原理--让我想起 倚天屠龙记 里的杨左史,长戟大刀蛾眉刺各种武器的招法都是能够溶入拳法之中的。



就黑白 (严格地说,灰度)图片而言,"去雾"的基本原理是添加对照度。人眼看到的全黑、全白,以及其间所有的过渡色调,在计算机图片中都是用数字来表示的。人眼是很精密和拥有极大检測范围的光学仪器,从明亮到直视的太阳,到电影院里黑暗的座号,都能看到。而计算机图片仅仅能展示人眼可承受的范围中很小的一部分。这部分中最重要的信息(对于黑白图片而言是所有)是亮度。计算机图片用数字的大小来表示亮度,越亮的,也就是越白的,用较大的数字,越暗的,也就是越黑的,用较小的数字表示。



这样,比方说,图片上的每一个像素,从最暗到最亮,就相应着从0到255之间的数字。各种图像处理软件中的gamma校正就是用来指定这样的相应关系的。这样的相应可能是线性的,也可能是非线性的,在非线性的情况下,可能数字变化了非常多,而亮度变化非常小--类似于你调洗澡时的冷热水,扭了半天,还是挺凉,突然就热得能烫突鲁皮。你可能认为,这不是有毛病吗?是的,这样的非线性有时会带来麻烦,可是,同一时候它还有个长处,那就是 识别度 好。



我们规定一个数值,低于它就是全黑,无论数值怎样变化;再规定一个数值,高于它就是全白,无论数值怎样变化。这两个数值就是黑到灰和灰到白的阀值。之所以低于某数就视为全黑,是由于我们可能不希望呈现这部分暗调的细节,之所以高于某数就视为全白,是由于我们可能希望把这些都表现为高光。



捕捉到的现实是一回事,怎样呈现,是全然不同的还有一回事。二猫昨天问到,为什么书里净写些吓人的事情,既然它们非常少发生。我说,假设灰姑娘的故事真的全然写实,那么,整个故事里你大部分时间看到的都不是她遇到王子的舞会和红舞鞋,而是灰姑娘成天给她后妈和后姐们做饭做饭做饭做饭做饭做饭做饭……做饭



相同,一本PDF电子书假设扫描不当,也可能呈现了过多的暗部和高光的细节,而灰色调子的过渡层次不够分明。暗部和高光的范围能够通过调整黑和白的阀值完毕,以下会继续介绍;灰色调子的过渡层次,能够通过细调gamma校正完毕,本文不讨论,请自学。



所以,提高有雾电子书的对照度,原理就是又一次设置黑和白的阀值。以上是原理部分,下面是操作方法。



知乎上有人说,把pdf中的图片都导出来,用photoshop处理调整gamma或者设置黑和白的阀值,然后再导入成PDF。原理正是如此,可是这须要安装高大上的收费工具photoshop和acrobat professional,还可能须要一页一页操作 (?) ,有些杀鸡用牛刀的意思。以下介绍成批处理的方法。



第1步 抽样,使用 ImageMagick 把 PDF 转换为图片。其实,我们仅仅须要当中的一两张,只是我不知道怎样完毕。ImageMagick是linux下和windows下都有的工具,支持命令行。



$ convert 1.pdf 1.jpg



这样,得到了一大批jpg图片。



第2步 尝试,使用 GIMP 确定白色和黑色的阀值。用GIMP也行,用photoshop也行,凡是能调灰度图片阀值的,都行。调到你感觉最好,没错,就是“感觉”,这是个主观标准。然后把白色和黑色的阀值记下来。GIMP是linux下的photoshop。



以上两步不做也行,那么,接下来的阀值就能够靠猜、靠经验、靠多次尝试。



第3步 使用 ImageMagick 改动对照度



$ convert -level 38%,99% 1.pdf 2.pdf



这行命令的意思是:低于38%的,视为黑,高于99%的,视为白,把源文件1.pdf转换后存为目标文件2.pdf。



由于调整阀值的同一时候,也自己主动调整gamma线,使之更陡峭,所以灰色调子的层次会更鲜明一些。





原理讲了一大堆,还是仅仅是精浅的介绍,而方法中真正起作用的仅仅是一行命令。所以,这个故事告诉我们,知道怎么干非常easy,而知道为什么这么干会成功就难得多。当然,唯其如此,才干把长戟大刀蛾眉刺的功夫用在拳法掌法这些徒手格斗之中。或者,唯其如此,才干把阴影透视和色彩模型应用在画妆上。

添加PDF文件对照度的粗浅原理,及方法的更多相关文章

  1. robotframework 测试工具添加PDF文件内容匹配插件

    robotframework  这个需要了解的请度娘.本文实现的是一个小功能.大体分为如下几个步骤 1)给定一个pdf文件. 2)读取pdf文件内容,并解析为文本内容. 3)通过给定的内容,比对pdf ...

  2. 操作PDF文件的关键技术点

    一个PDF文档从大到小可以分成如下几个要素:文档.章节.小节.段落.表格.列表. com.lowagie.text.Document表示PDF文档.必须为它创建一个PDF写入器,即com.lowagi ...

  3. 编辑方法分享之如何编辑PDF文件内容

    我们现在在工作中会经常使用到PDF文件,还会有遇到需要编辑PDF文件的时候,PDF文件的编辑问题一直是个大难题.很多朋友在面对PDF文件的时候束手无策,不知道该怎么对它进行编辑.下面小编就教给大家一个 ...

  4. 织梦中在线显示pdf文件的方法

    如何在织梦中添加pdf文件并显示呢?下面这个教程将带领大家来操作.(注:手机版无法查看) 第一步:在系统-系统基本参数-附件设置中添加pdf格式 并且将大小调大 第二步:在核心-内容模型-普通文章中添 ...

  5. C# Parsing 类实现的 PDF 文件分析器

    下载示例 下载源代码 1. 介绍 这个项目让你可以去读取并解析一个PDF文件,并将其内部结构展示出来. PDF文件的格式标准文档可以从Adobe那儿获取到. 这个项目基于“PDF指南,第六版,Adob ...

  6. 利用python第三方库提取PDF文件的表格内容

    小爬最近接到一个棘手任务:需要提取手机话费电子发票PDF文件中的数据.接到这个任务的第一时间,小爬决定搜集各个地区各个时间段的电子发票文件,看看其中的差异点.粗略统计下来,PDF文件的表格框架是统一的 ...

  7. PDF 文件编写器 C# 类库(版本 1.28.0)使用详解

    PDF File Writer 是一个 C# .NET 类库,允许应用程序创建 PDF 文件. PDF File Writer C# 类库使 .NET 应用程序能够生成 PDF 文档.该库使应用程序免 ...

  8. 加密PDF文件的打印问题

    工作中遇到网上下载的PDF文件加密,并且不能打印 解决方法: 1.解密: 去网站下载解密软件,1M左右:http://www.onlinedown.net/soft/19939.htm 直接解压,运行 ...

  9. C#如何在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...

随机推荐

  1. 进阶:案例六: Context Menu(静态 与 动态)

    实现: 1.add: 2.delete 3.add2 实现步骤: 1.新建属性display_text 2.创建layout 3.代码部分: add事件: METHOD onactionadd . D ...

  2. 高斯消元法~get√

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  3. Codeforces Round #256 (Div. 2)总结

    这次CF状态之悲剧,比赛就别提了.后来应该好好总结. A题:某个细节没考虑到,导致T了 代码: #include<cstdio> #include<cstring> #incl ...

  4. ABP模块设计

    ABP模块设计 返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术 ...

  5. 终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)

    MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的: 当WM_PAINT不是由Inv ...

  6. 一句话解释JVM中空间分配担保的问题

    先解释YGC: 当对象生成在EDEN区失败时,出发一次YGC,先扫描EDEN区中的存活对象,进入S0区,S0放不下的进入OLD区,再扫描S1区,若存活次数超过阀值则进入OLD区,其它进入S0区,然后S ...

  7. MVP模式在Android开发中的应用

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...

  8. Swift - 属性观察者(willSet与didSet)

    属性观察者,类似于触发器.用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应.有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet. ...

  9. js 常用正则表达式分析详解

    1.整数或者小数:/^((0{1}|[1-9]{1}[0-9]+)\.{1}[0-9]+|[1-9]{1}[0-9]*|0)$/ 分析:分类讨论,如果是小数,则有两种形式   0.111对应的是 0{ ...

  10. 14.5.1 Resizing the InnoDB System Tablespace

    14.5.1 Resizing the InnoDB System Tablespace 本节描述如何增加或者减少InnoDB 系统表空间的大小 增加InnoDB 系统表空间的大小 最简单的方式增加I ...