垂直投影法分割驗證碼

2021-09-19 03:05:52 字數 1991 閱讀 7378

字元分割的方法太簡單(哈哈,我是故意的,就是想試試看有沒有效果);

神經網路也太落後,哪有三層就想搞定這種事情;

基於學姐給的建議以及自己查閱資料以後的結論,我會嘗試用更多的演算法來對字元進行分割。

分割字元最常用的方法就是:垂直投影法、連通域分析法。其中連通域分析法對於非粘連字元的分割有很好的效果,但是對於粘連字元,就沒有任何的效果。

而垂直投影法對於粘連字元可能會有很好的效果。但是,因為我們選用的驗證碼粘連嚴重,所以對於垂直投影法的使用,可能會有很大的影響,即,兩個字元的連線部位不是畫素點最少的位置,很可能造成分割位置的偏移。

但是,不論怎麼說,讓我們來嘗試一下分割效果。

垂直投影法,簡單來說就是將每一列上的符合要求的畫素都「沉到」底部,並找到最薄弱的位置作為切割的位置。換一種說法就是統計出每一列上的符合要求的畫素點的個數,並找到其中的薄弱點進行切割。

垂直投影法有乙個重要的假設就是,兩個字元的連線位置相對於字元本身位置的畫素點的個數較少,也就是可以通過比較相對位置的畫素點的個數得到的分割位置,如下圖所示:

所以,這一次的字元分割,我們採用垂直投影法進行分割。

1.為了減少不必要的開銷,我們首先將中的空白部分從驗證碼中剔除,只保留包含所有的驗證碼的有效畫素點的部分;

2.接著我們通過遍歷得到已經分割以後的中每一列的有效畫素點的個數,並儲存在鍊錶中;

3.在相對的四分之

一、二分之

一、四分之三的相對位置,我們尋找最小的畫素點的位置,這一點的目的是為了找到相對位置的最好的分割點,進行直線切割

def vertical_projection(img):

rows, cols = img.shape

maxleft = 100

maxright = 0

# 尋找最左邊的點

for j in range(cols):

for k in range(rows):

if img[k][j] == 0:

maxleft = j

break

if maxleft != 100:

break

# 同樣演算法,從右邊開始,找到最右的點

for j in range(-cols, 0):

for k in range(rows):

if img[k][-j - 1] == 0:

maxright = -j

break

if maxright != 0:

break

# 基本想法:

# 1.取得內容的最左的一列,加上最右的一列,將兩者中間即為中的字元所在的位置

# 2.將這個範圍內的每一列為黑的畫素點的數目進行統計,並存放在陣列中

number_of_black =

for j in range(maxleft, maxright):

number = 0

for k in range(rows):

if img[k][j] == 0:

number += 1

base = int((maxright - maxleft) / 8)

addition = int((maxright - maxleft) / 4)

section =

for j in range(1, 4):

min = base + addition * (j - 1)

for k in range(base + addition * (j - 1), base + addition * j):

if number_of_black[k] < number_of_black[min]:

min = k

return maxleft, maxright, section

pass

提取碼:57dj

c 垂直投影法 驗證碼降噪方法彙總

0.bmp.getpixel i,j toargb color.black.toargb 判斷畫素點顏色是否為黑色。1.這是乙個c 中講bitmap物件方法的博文 經過這幾天的研究想總結下驗證碼預處理的一些方法 驗證碼預處理方法主要有 0.0 上下腐蝕 對於斜線效果比較好,是橫線用水平腐蝕,豎線用垂...

RGB驗證碼分割

只貼出了邊緣檢測以後,至於切割出單個的字母,可根據驗證碼的實際情況進行切割。主要是聚類分割 中值濾波去噪,二值化,邊緣檢測。subplot 231 imshow i,map title 原始影象 y,x,z size i d1 zeros y,x d2 d1 myi double i i0 zero...

opencv 垂直投影分割字元

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