《我的眼睛--圖靈識別》第八章:訓練:圖像字符切割

《我的眼睛–圖靈識別》第八章:訓練:圖像字符切割

圖像字符切割是把圖像上的每個文字分割成獨立的單個字符,這是識別最有效的基礎。
字符分割是圖像識別最關鍵的一步,因爲分割的正確與否直接關係到最後的結果,如果4個字符分割成了3個,即便後面的識別算法識別率達到100%,結果也是錯的。當然,前面預處理如果做得夠好,干擾因素能夠有效的去除,而沒有影響到字符的像素點(px),那麼對分割來講就容易得多。反過來,如果前面的干擾因素都沒有去除掉,那麼分割出來的可能就不是字符了。
字符的黏連是分割的難點,這一點也可以作爲驗證圖形碼安全係數的標準,如果圖像上的幾個字符完全是分開的,那麼可以保證字符分割成功率是百分之百的,這樣識別的難度就降低了很多。
圖像字符切割的方法很多,比如:滴水分嶺、水平垂直投影、離散聚類、傅里葉變換、八皇后、泛水填充、直方圖和掃描線等等,這些都太專業了,不一般的人不用學,一般的人又學不會,至少我現在還都不會懂的玩:)

1、固定位置

固定位置(Fixed Location)切割方法就是,首先確定圖像上的首個字符左上角的位置作爲起始點座標,並設置寬度和高度組成單個字符的切割範圍,再確定切割的字符數量,即可進行準確定位切割出每個同等大小的獨立字符。
主要適用於圖像中的字符都是固定位置的,而且字與字之間還必須是間距相等的。

在這裏插入圖片描述
(等間距)固定位置切割

這是最基礎的、最簡單的和最粗暴的一種字符切割方法,它會無視字符黏連、位置錯亂和干擾因素等等,但無法保證切割出來的字符是完整性的,有可能會出現少一部分或者多一部分數據的情況。

在這裏插入圖片描述
固定位置切割情況

等間距的圖像字符如何進行固定位置切割?
具體操作步驟如下:
第1步,首先找到圖像上的每個字與字之間的間隔距離,只需要對同大小或同個字符的左邊位置進行距離計算即可;

在這裏插入圖片描述
原始圖片

在這裏插入圖片描述
字之間的間距尺

第2步,之後在不變距離的情況下調整間距尺的位置,使其每個字符的最左邊不能留有像素做到剛好對齊,這樣就能確定每個字符最左邊的位置;

在這裏插入圖片描述
字符最左邊的位置

第3步,再找到所有字符的最上邊和最下邊的位置,就完成了高度範圍的確定;

在這裏插入圖片描述
確定高度範圍

第4步,此時已經能夠得到首個字符的左上角的位置,完成了起點座標的確定;

在這裏插入圖片描述
每個字符左上角位置

第5步,接着設置每個字符需要切割的寬度和切割的字符數量;

在這裏插入圖片描述
字符寬度和數量

第6步,最後根據首個字符左上角位置的起點座標(假設1,1)、字符的寬高(5px和8px)、字符的間距(6px)和字符的切割數量(8),最終就完成了固定位置的字符切割。

在這裏插入圖片描述
進行固定切割

在這裏插入圖片描述
切割完成的字符

固定位置切割方法優缺點也是非常的明顯,就是不靈活太死板了。優點就是不需要去遍歷定位切割範圍的時間;缺點就是切割位置死板,切割大小和數量都是固定的。

在這裏插入圖片描述

在這裏插入圖片描述
問題:
如果存在雙排字符的圖像,如何進行固定位置切割?

在這裏插入圖片描述
(作業)雙排字符

VB6代碼:

調用例子:

Dim 切割字符() As 切割類型
Call 切割_固定位置(圖像數據, 0, 0, 5, 8, 6, 4, 切割字符)

封裝函數:

Public Type 切割類型
    寬 As LongAs Long
    點陣 As String
End Type
 
Public Sub 切割_固定位置(圖像數據() As Byte, 起點x As Long, 起點y As Long, 字寬 As Long, 字高 As Long, 字間距 As Long, 字數 As Long, 返回切割字符() As 切割類型)
Dim w As Long, h As Long,As Long,As Long
Dim i As Long, x As Long, n As Long, 點數 As Long
Dim 字庫點陣() As 切割類型, 單個點陣() As String, 多個點陣() As String= UBound(圖像數據, 2)= UBound(圖像數據, 3)
    n = 字數 - 1
    ReDim 字庫點陣(n) As 切割類型
    ReDim 單個點陣(字高 - 1) As String, 多個點陣(字寬 - 1) As String
    x = 起點x
    For i = 0 To n
        For w = 0 To 字寬 - 1
            If w + x >Then Exit For    '爲數據越界處理
            For h = 0 To 字高 - 1
                If h + 起點y >Then Exit For    '爲數據越界處理
                If 圖像數據(0, w + x, h + 起點y) = 255 Then
                    單個點陣(h) = 1
                Else
                    單個點陣(h) = 0
                End If
            Next
            多個點陣(w) = Left(Join(單個點陣, "") & String(字高, "0"), 字高)    '拼接點陣
        Next
        點數 = 字寬 * 字高
        字庫點陣(i).寬 = 字寬
        字庫點陣(i).高 = 字高
        字庫點陣(i).點陣 = Left(Join(多個點陣, "") & String(點數, "0"), 點數)    '拼接點陣
        x = x + 字間距
    Next
    返回切割字符 = 字庫點陣
End Sub

按鍵精靈2014腳本:

調用例子:

Call Plugin.TULING.Pixel_FromScreen(0,0,200,100)
Call Plugin.TULING.Filter_Binaryzation("0-128")
//顯示獲取的圖像
Call Plugin.TULING.Pixel_Preview()
數量=Plugin.TULING.Incise_FixedLocation(0,0,64,64,50,3)    //固定位置切割
For i = 0 To 數量
    Call Plugin.TULING.Incise_Preview(i)
Next

未完待續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章