前言
在上文(文字切割演算法-基於投影的切割)中發現切割結果並不是很理想,所以在本文提出優化演算法對結果進行進一步處理。本演算法的解決思路很簡單,即針對已暴露出的問題進行解決,對於未暴露的問題就無能為力了。所以演算法的魯棒性並不是很好,但是簡單易實現。
對基於投影的切割結果進行觀察,可以將問題總結為三類。
整體連線
多個文字連線在一起
左右結構分開
左右結構的文字被切割成兩個字
左右結構分開後連線
左右結構的文字分開後,又與前後相鄰文字相連
整體連線
由於漢字是方塊字,可以認為每個字的長寬比例都是差不多的,基本都是1:1(金龍魚調和…呸)。對於整體連線在一起的文字,可以先計算整體的長寬比。如果比例是接近於整數的(±0.2),則認為這是整體連線在一起的多個字。再計算每個字的平均長度進行切割,就可以得到乙個比較不錯的結果。
如上圖,這是四個字連在一起的。長寬比:104/27≈3.85,3.85>4-0.2所以我們認為它是4個字。則平均寬度:104/4=26,按照26*27的寬長進行切割,就可以得出結果。(這裡的長寬比是:寬度/長度)
左右結構分開
由於左右結構分開後,兩張的長寬比與數字符號的長寬比相似。所以我們無法判斷到底是偏旁還是符號,這樣就無法進行連線。這個問題將在以後提出識別演算法對進行識別後解決。
如上圖,由於無法識別內容,所以無法判斷到底是「7」與「阝」連線,還是「阝」與「艮」連線。
左右結構分開後連線
採用整體連線的解決思路,先計算長寬比,如果發現長寬比不是在整數附近的(>±0.2),則認為這是左右結構分開後連線的。因為這種情況都是兩張圖,所以在發現第一張是分開後連線的,則將這張圖先以1:1進行切割,再將剩下的部分記錄。如果這張圖相鄰的下一張也被判斷為是分開後連線的,則將上一張圖剩下的部分與這張圖的開頭相連線,再進行1:1切割。這樣就可以得到乙個不錯的結果。
如上圖,先對第一張進行1:1切割,即按照27*27的大小從開頭逐步向後切割,記錄最後剩下的部分「丬」。再判斷下一張圖,發現也是分開後連線的,則按照27*27的大小從末尾逐步向前切割,得到剩下的部分。最後將這兩個剩下的部分進行連線,得到乙個完整的「北」。
(當然這裡要求在投影切割時記錄兩兩之間的距離,這樣才能還原被切割後的)
切割結果如下:
在採用上述優化演算法後,發現切割結果有了顯著的成效。但是還是會存在一些不足,這些問題會在以後提出識別演算法後進行優化。文字切割出來後,我們可以通過相似度比對演算法對特徵進行提取,以進行識別。
專案原始碼:
我的github
(
簡訊切割演算法
在乙個專案中,要用到手機傳送簡訊,但是使用的簡訊貓卻無法支援大於70個字元的情況,而且經常收到有朋友的簡訊,比較長的手機都會自動將它切成幾個簡訊傳送。有時候很搞,收到的簡訊有兩條,第二條就只有乙個句號而已。或者幾乎這種手機都不會去理解語義,直接就在70個字元處切割。要做到完全理解語義也不大可能,但是...
簡訊切割演算法
在乙個專案中,要用到手機傳送簡訊,但是使用的簡訊貓卻無法支援大於70個字元的情況,而且經常收到有朋友的簡訊,比較長的手機都會自動將它切成幾個簡訊傳送。有時候很搞,收到的簡訊有兩條,第二條就只有乙個句號而已。或者幾乎這種手機都不會去理解語義,直接就在70個字元處切割。要做到完全理解語義也不大可能,但是...
python 切詞演算法(正向切割 反向切割)
author wanghuafeng coding utf 8 import os import sys import codecs from collections import deque try path os.path.dirname os.path.abspath file except ...