利用投影法進行字元分割

2021-07-30 07:50:38 字數 1636 閱讀 3700

目錄(?)

[+]

字元分割有很多方法,但並不是每一種方法是萬能的,那麼就需要根據自己的需要來分析。例如:我現在專案的需求是將一串編號給切分開來。查了網上的資料和文獻,大致適合專案的有兩種方法:投影分割法和連通域分割法。當然還有其他的一些改進的演算法,今天就不作深入討論,以後研究了再分享。

投影法的原理其實很簡單,利用二值化的畫素的分布直方圖進行分析,從而找出相鄰字元的分界點進行分割。

上圖其實已經看的很明白,投影所反應的就是在垂直方向上數字區域畫素個數。接下來我們只需判斷投影的每一列,即可找出分割點。

首先,定義乙個陣列用來儲存每一列畫素中白色畫素的個數。

int perpixelvalue;//每個畫素的值

int* projectvalarry = new

int[width];//建立乙個用於儲存每列白色畫素個數的陣列

memset(projectvalarry, 0, width*4);//必須初始化陣列

然後,遍歷二值化後的,將每一列中白色的(也就是數字區域)畫素記錄在陣列中。

//遍歷每一列的影象灰度值,查詢每一行255的值

for (int col = 0; col < width; ++col)}}

最後,根據陣列裡的灰度值畫出投影圖

/*新建乙個mat用於儲存投影直方圖並將背景置為白色*/

mat verticalprojectionmat(height, width, cv_8uc1);

for (int i = 0; i < height; i++)

}/*將直方圖的曲線設為黑色*/

for (int i = 0; i < width; i++)

}imshow("【投影】",verticalprojectionmat);

delete projectvalarry;//不要忘了刪除陣列空間

有了投影圖做切割就很容易了,其實最主要的就是那個儲存灰度值的陣列,下面就需要根據這個陣列的內容來找到相鄰字元間的分割點。

vector

roilist;//用於儲存分割出來的每個字元

int startindex = 0;//記錄進入字元區的索引

int endindex = 0;//記錄進入空白區域的索引

bool inblock = false;//是否遍歷到了字元區內

for (int i = 0; i < srcimg.cols; ++i)

else

if (projectvalarry[i] == 0 && inblock)//進入空白區了

}

最後來看下效果圖: 

做影象分割的時候要選擇合適的方法,例如我這張樣本圖的布局是左右型,就適合用垂直投影的方法,反之若是上下型,則做水平投影即可。若影象內的字元是縱橫交錯的話就需要先垂直投影分割再水平分割,或者採用連通域分割法,取出字元範圍。

opencv利用投影法進行水平切割和垂直切割

水平投影切割 include include using namespace std using namespace cv int main for y 0 yheight y vectorroilist 用於儲存分割出來的每個字元 int startindex 0 記錄進入字元區的索引 int e...

opencv 垂直投影分割字元

原圖 include opencv2 imgproc imgproc.hpp include opencv2 highgui highgui.hpp include include using namespace cv using namespace std vectorhorizontalproj...

垂直投影法分割驗證碼

字元分割的方法太簡單 哈哈,我是故意的,就是想試試看有沒有效果 神經網路也太落後,哪有三層就想搞定這種事情 基於學姐給的建議以及自己查閱資料以後的結論,我會嘗試用更多的演算法來對字元進行分割。分割字元最常用的方法就是 垂直投影法 連通域分析法。其中連通域分析法對於非粘連字元的分割有很好的效果,但是對...