作者:馬健
郵箱: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中也允許用戶自己對目標矩形的比例、尺寸進行設置。