怎样快速扫描一本书并做成电子版?
写在前面
未经授权翻印图书是触犯法律的,传播出去更是有巨大的法律风险,请注意图书的版权页申明。本文展示的图片仅为展示效果,以分享经验为目的。如果涉及侵权,请联系我,我将及时删除。
-------------------
我最近扫了一本1260页的书,最终制作成了具有文本检索功能的pdf和djvu格式。整个过程大约花费一整天时间(主要是查找各种方法消耗时间,下次再扫估计要求低点两个小时可以搞定),费用为零。(不用扫描仪,仅使用手机+电脑)。
效果大概像这样:
实际操作非常简单,不过有很多小trick,特别分享给有需要的人士。大致流程是:
- (用手机)拍照
- 照片效果优化,例如裁剪、转成黑白图、调明暗对比等(扫描全能王一键搞定)(Edit: 后来发现了一款更牛逼的开源软件,见下文)
- 在电脑端将大量图片组合成pdf或djvu文档
- 对pdf和djvu文档做OCR,并将结果嵌入对应的文档中,这样就可以在阅读的时候选中文字进行拷贝
下面逐一详细讲解:
问题分析
我的需求是,从图书馆借了一本在网上找不到的经典图书,由于太过经典,想要保留一份电子档。碰到这个需求时,我第一反应是在网上搜到了包含本帖的若干个提问。总结一下网友提出的方案和我认为的弊端:
- 买一个传统扫描仪,很多二手货很便宜。譬如这里提到的中晶V700Plus,淘宝二手标价才168起。弊端包括:1. 二手不敢信(十几年的老机器了),新的又不合算。2.扫描速度好像也不是很快。3. 一次性使用,浪费了资源。
- 有好几家创业公司推出了专用的拍照式书籍专用扫描仪。弊端是:更贵、评价似乎也不是很好、浪费资源
- 淘宝上有不少书籍扫描服务商。我问了其中一家,不破坏图书的情况下需要两毛钱/页。扫我那本书要花200+软妹?算了吧
由于早就听说了“扫描全能王”这款神级手机APP,下载先试用了一下,效果非常令我满意。不仅自动查找书籍边缘自动裁剪,还能自动优化图像。
最难的问题——扫描,都能这么轻松的解决,其它步骤不就简单多了吗?动手吧!
拍照
由于页数比较多,端着手机拍又慢,效果又不好,一个人还不好操作。
因此你需要一个工作台:
如上图所示,关键点在于:
- 给手机接上有线耳机,这样耳机上的音量键就可以当做快门键
- 把手机架高(例如放纸箱上,用重物把手机下巴压住,这样摄像头能外伸出来很多)
- 书最好放在深色的桌子上,这样扫描程序能更好的自动获取边界
- 书的两侧架两盏台灯(由于条件简陋,仅拿了个白色的箱子当反光板用,好在扫描全能王能自动去除黑白图中的阴影。彩色扫描的话,仍然需要很好的光源,并用白纸包住光源,保证光是柔和的散射光。当然,找个阴天在室外操作是最佳方案)
- 先拍奇数页,再拍偶数页。如此操作可以加快翻页速度
在这台架子的辅助下,我扫描(拍照)的平均速度大约能达到3秒/页
裁剪与优化
---------------- edit ----------------
原先使用的“扫描全能王”确实不错,但是今天发现了一个更牛逼的开源软件 Scan Tailor Advanced 。
Windows安装包原始链接见下文。为答谢大家支持,已汉化该软件,下载地址:链接: http:// pan.baidu.com/s/1hYNKpS -oG6MS3DP2tcZigg 提取码: vnt7。github连接不畅的童鞋可以在我的网盘下载。里面还有个文件夹叫“中文语言包”。其中的文件:
- scantailor_cn.qm:编译好的汉化语言文件
- scantailor_cn.ts:翻译的源文件,macOS和Linux用户可以下载这个文件放在translations目录里,这样编译之后就能有中文。
- 使用说明.txt:里面讲了简单的操作步骤。
- 如果操作正确,在软件的设置页面里可以把语言改成中文。(语言显示为“C”,正不知道为啥呢)
它可以实现的功能有(全都带* 自动 *批处理):
- 90/180/270°旋转图像,所以横竖拍都没事
- 切割页面,所以可以双面拍摄(双面时页面通常展不平,需要用到下文会讲的去畸变)
- 纠偏,拍斜了能自动检测并纠回来
- 检测页面内容范围,只取有效文字范围
- 增加边距
- 图像增强(阴影、杂点去除)
- 去畸变(这个有点屌)
Edit: 实测双面拍摄之后畸变太大,自动去畸变效果并不好,不过可以手动一张一张的调,这样有点费事我不推荐。最好还是展平一次一页的拍,有块玻璃压住页面就更棒了!(淘宝几十块钱定做一块加厚钢化玻璃。推荐雾面的,普通光面玻璃容易反光,像镜子一样)
上文已经提供了github源代码链接,Windows还提供了安装包: 64位 , 32位 。Linux和macOS需要自行下载编译哦。我在macOS和Ubuntu 16.04下测试通过。win安装包是github官方提供的,我并没有为大家打包哈。
编译所需依赖项的不完整列表:
- cmake >= 3.9.6
- boost >=1.60
- libjpeg
- libtiff
- libpng
- qt5 >= 5.6
- zlib
注:ubuntu 16.04编译Scan Tailor Advanced稍微费劲点,主要是gcc,boost,qt5的版本都老掉牙,需要手动安装boost和qt5,并改一点点代码照顾老黄历的gcc。
--------------------------------------
以下为原方案,比Scan Tailor效果差不少。
全部由“扫描全能王”在手机(后来换到iPad,因为屏幕大好操作)上操作实现。由于这款软件的帮助实在太大,特意给它打个广告。本人与该公司全无瓜葛,利益无关。
具体操作可以自行去应用商店里下载后体验。简单说就是:
从相册导入照片 => 逐张照片处理(多数工作自动化一键搞定)=> 把处理后的图再导出到手机相册
这款APP有直接导出为PDF的功能。由于如下原因,我没有这么做:
- 我是奇偶页分开拍照的,导入APP之后不能调节顺序,只能按照导入的顺序处理和导出至PDF。我那本书页数非常多,光是调节顺序就得累死我呀
- 免费版在PDF页面右下角会有水印,去除起来相对较麻烦。(也有简单的办法,就是再加个纯白的水印在原水印的位置,但是有点丑陋,会加大页边距。碰到彩色扫描更是行不通)
- 收费版是会员制的,一个月会员30,一年会员200+。喜欢简单省事的同学可以考虑一下。
在电脑端组合成PDF/DJVU
注:以下有些步骤可以用命令行的开源软件提高效率,安装方式(由于不太懂Windows,只提供Ubuntu和macOS的操作指南):
Ubuntu 16.04下
sudo add-apt-repository spa:alex-p/tesseract-ocr sudo apt update sudo apt install tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim imagemagick pdf2djvu djvu2pdf
macOS下
brew install tesseract imagemagick djvu2pdf
很多操作我是在Ubuntu下完成的,mac版并没有测试。另外macOS可以使用automator完成差不多功能。
- 调节顺序
导入电脑后,碰到的第一个问题是怎么排序。用批量重命名工具即可,把原来的"IMG_1327.JPG"重命名成类似这样:奇数页"book-0001.jpg", "book-0003.jpg",偶数页"book-0002.jpg"。。。然后再扔进同一个文件夹
要是你找不到合适的重命名工具,要么手工一个个改,要么懂一点编程,参考如下Python代码:
#!env python import os def rename(dirname, start_with): files = os.listdir(dirname) files.sort() for f in files: if f.endswith('jpg'): output_name = dirname + 'book-{0:04d}.JPG'.format(start_with) os.rename(dirname + f, output_name) start_with += 2 print('DONE') rename('/path/to/odd/images/directory', 1) # 指定奇数页图片文件夹位置,并重命名 rename('/path/to/even/images/directory', 2) # 指定偶数页图片文件夹位置,并重命名
- (可选)微调图像
这是因为原始图片分辨率不一致,先转换一下比较好。另外,图像边缘不可避免还是有些黑色的阴影痕迹需要去除。
我从扫描全能王导出的图片多数分辨率在1500x2336左右(其实是可以调高的,我后来才发现)。所以我打算把图片统一分辨率到1550x2336(注意不是缩放,而是不足1550白色背景来补,多了裁掉)
将所有图片放在同一文件夹下,执行如下shell(zsh)命令:
for file in ./*(.); do convert $file -background white -gravity center -extent 1550x2336 -sharpen 0x3 $file; echo "finished $file"; done;
要去除黑边的话,先制作一张1550x2336的png图片,中间部分扣空,仅保留很窄的白色边框,然后跟每张图片组合一下就能盖住黑色阴影了,就像加了个白色的相框。
假设这个边框png文件叫做'/tmp/frame.png',也是一条命令搞定(可以和上一条命令组合成一条命令)
for file in ./*(.); do composite $file /tmp/frame.png -dissolve "0.01" $file; echo "finished $file"; done;
- 转成PDF
两条命令搞定(并且同时搞定OCR)
ls . > file_list.txt tesseract file_list.txt book pdf
注意:
- 'book'和'pdf'之间有一个空格,不要以为是'book.pdf'
- tesseract是一个开源的OCR库,默认识别英文,实测4.0.0版本以上英文识别 非常完美 。因为从这一版本开始加入了基于神经网络的检测算法。4.0.0版本以下就不要尝试了,效果只能说很烂,这也是为什么安装tesseract要用ppa。
- 由于我正好是扫英文书,所以没试中文效果。如果要做中文OCR识别,大概的操作需要对应替换成(记得先安装中文识别库):
tesseract -l chi_sim file_list.txt book pdf
结语
写这篇回答之后,发现这个主题在国外一点也不新鲜,还有一个专门的网站 www.diybookscanner.org ,欢迎入坑。
举个例子:
原文链接在此:
Original ~600pg/hr, very portable scanner now achieving ~900pg-1100pg/hr本想分享点经验,发现门槛还是有点高。就不分享djvu转换的方法了。英文好可以参考
Help:DjVu files - Wikisource, the free online library以及这个OCR脚本
User:Inductiveload/Scripts/DJVU OCR以及 这个脚本
写得有点极客,其实不懂的话只是稍微麻烦一点。或者花点钱买一个月会员省事。
来源:知乎 www.zhihu.com
作者:邹鲁
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。点击下载
此问题还有71 个回答,查看全部。
延伸阅读:
买了纸质版的书以后,你们会再买他的电子版吗?