ComicEnhancerPro 系列教程 附录六:CEP处理之自动分页与自动梯形矫正
作者:马健
邮箱:stronghorse_mj@hotmail.com
主页:http://www.comicer.com/stronghorse/
发布:2020.12.31
一、自动分页
CEP从v5.00开始,在“书籍处理”界面中提供半自动分页功能:用户自己选择是分双页还是分单页,然后软件自动找左右边界和中缝,实现分页。
采用半自动的原因,是因为中文特有的“双页右翻”问题:现代书籍都是学习西方习惯往左翻页,但中国古代书籍的传统习惯是往右翻页。在全自动化情况下即使能判断出某一页是双页并排,但实在是没有算法可以判断出这一页究竟是左翻还是右翻,所以为了支持中文出版的传统习惯,只能引入人工判断。好在整本书不会是前几页左翻,后几页又变成右翻,所以设定一页后批量应用到其他页即可,也不费事。
软件分页的底层技术其实就是找直线:书页的左、右边界是直线,中缝也是直线。找直线的算法则是现在应用得比较成熟的霍夫变换(Hough transform),在opencv中不仅用它找直线,还用它找圆,详见opencv相关代码,也可以看看这里的说明:
https://blog.csdn.net/zhu_hongji/article/details/81632611
如果要全自动分页,一般在两种满足两个条件时可以判断是双页:1、图像宽度大于高度。2、在图像中间部分找到了足够长的直线(中缝),然后按照中缝分页即可。如果不满足这两个条件,则是单页,按照在两侧找到的足够长直线切边即可。
如果是半自动分页,因为已经靠人工判断了是单页还是双页,所以找起来目的性更强一点:先在图像的左、右侧找页边界,有必要时再在中间区域找中缝,不需要就不找中缝,最终整体时间还能比全自动少一点。
如果在同一区域找到多条直线备选,就取最长,即通过的像素点最多的那条。
因为找到的直线最终是要延伸到页面的上、下边界,所以记录直线坐标时没有必要记录y向坐标,只记录x向坐标即可,还能节省一点内存。
二、自动梯形矫正
CEP从v5.00开始,在“书籍处理”界面中提供自动梯形矫正功能,可以用来处理手机拍的PPT、白板等,也可以用来矫正有压板扫描仪因为相机感光平面与压板不平行造成的透视畸变——“梯形矫正”(de-keystoning)其实是通俗的说法,术语是“透视矫正”(Perspective Distortion),因为正是透视的“远小近大”原理,才造成在相机感光平面与被拍摄平面不平行时,把矩形拍成了梯形。
自动梯形矫正虽然在功能上看似与自动分页无关,但其实两者在底层实现上都一样:都是用Hough transform找直线,只不过分页找到竖向直线即可,梯形矫正除了找竖向直线外,还需找横向直线。所以在搞定一个后,再搞定另外一个就事半功倍。
找到上下两条直线和左右两条直线后,求出直线交点,即可得出梯形的4个顶点。再用这4个顶点解方程,即可得出一个正向映射矩阵,可以把这4个梯形顶点映射成矩形的4个顶点。用这个正向映射矩阵对全图 进行映射,中间像素点用插值算法进行平滑,就是CEP的“梯形矫正”功能。opencv的相关算法和实现讨论参见这里:
https://blog.csdn.net/rrrfff/article/details/77340641
上述正向映射采用全图映射,会产生一个问题:梯形之外的区域也参与映射,有时候就会产生空白,需要对空白区域进行填充。因此在CEP中还提供了“梯形矫正+裁切”功能:对求出的正向映射矩阵再求逆,用逆矩阵进行反向映射,且只映射目标矩形区域内的内容,这样最终出来的矩形就不含原梯形之外的内容,也就不需要进行填充。
“梯形矫正+裁切”功能在进行逆向映射时,除了要知道源梯形的4个顶点坐标,还需要知道目标矩形的4个顶点坐标。软件按照内置规则,从梯形坐标自动计算出来的矩形顶点坐标不一定合用户的意,所以在CEP中也允许用户自己对目标矩形的比例、尺寸进行设置。