種子填充演算法在驗證碼識別中的的應用

2021-04-08 14:24:42 字數 4290 閱讀 8137

模擬精靈識別驗證碼的能用是強大的,乙個函式即可以去除雜色雜點,但是有時候驗證碼中有大量的干擾線,並且位置隨機變動的太歷害,這時候我們在處理驗證碼以前首先去除這些干擾線並準確的去除背景提取字元.

下面是乙個模擬精靈初步處理後的驗證碼.已經去除了雜色、雜點.但是上面還是有干擾線.

乙個可選的辦法是用中值濾波再處理一下。img:median(2); 乙個函式呼叫就可以,但是這樣雖然去掉了干擾線,原來的字元也被少量的破壞了。

論壇有使用者提出用種子填充演算法來分析干擾線。

原貼: http://www.yhhe.net/bbs/dispbbs.asp?boardid=4&id=3308&page=1

但是在演算法的設計上存在問題,效果不理想。

下面是改進演算法以後重新寫的**,不但能去除雜點,而且可以去除周圍的空白(提取位置隨機變化的驗證碼),

稍加修改還能有更多的用途.

下面是自動處理以後的效果

(干擾線沒有了,周圍的空白沒有了,速度也很快,接近零延時)

下面是全部的源**:

--[[

用乙個table結構表示影象上的「座標點」

用一組點構成table結構表示影象上的一條「線」。所有相連的黑色的點被認為是一條「連通線」。

找出最長的一條「連通線」,被認為是字元,其他的認為是雜點。

演算法原理與種子填充演算法相似。

首先讓用img:bpp函式處理為黑白,並初步去除雜色。

先找到乙個黑點,建立乙個表示「座標點」物件,並新增到「連通線」中。

然後在黑點周圍8個點中,再找黑色的點,找到就新增到「連通線」,這樣一直遞迴下去

直到遍歷影象所有點,可能有幾塊。

清除雜點使用方法

image.scan(img);

清除雜點並切去掉周圍的空白

image.scan(img,true);

--]]

function image.scan(img,crop)

--用乙個table陣列記錄所有的「連通線」

assert

(img:ok(

),"image.scan 的引數必須是乙個有效的"

);local

tlines =;

--首先計算出的高度寬度,避免重複的呼叫

local

w = img:width(

);local

h = img:height(

);--[[以table形式定義乙個陣列,對應圖象中的每個點。

作用相當乙個開關,首先值為false,但黑點首次被遍歷到時。把這個值變為true。

下次,再找到這個點時忽略。避免重複加入連通線。 

--]]

local

tchked =;

for i=0

,w,1 

dotchked[i]=;

for j=0

,h,1

dotchked[i]

[j]=false

;end

;end

;-----去噪

img:bpp(1);

img:bpp(

24);

--首先計算出各點的顏色值,避免在迴圈遞迴中重複的取

local

tcl=;

for i=0

,w,1

dotcl[i]=;

for j=0

,h,1

do

tcl[i]

[j]=img:getpos(i,j);

end;

end;

--[[

算點數函式

引數x,y 座標

引數tab 所屬連通線;

--]]

local

function

seed(x,y,tab)

---出界了則返回

if(x<0

or y<0

or x>w or

y>h)

then

return

;end

;---點的顏色為白色時,返回,不處理。

if(tcl[x]

[y]==16777215

)then

return

;end

;---值為1,則計數加1,返回

if ( tchked[x]

[y])

then

return

;else

table.insert

(tab,

);--新增到連通線裡

tchked[x]

[y]=true

;---當值為0時,把值置為1。

seed(x+1

,y-1

,tab);

seed(x,y-1

,tab);

seed(x-1

,y-1

,tab);

seed(x-1

,y,tab);

seed(x+1

,y,tab);

seed(x-1

,y+1

,tab);

seed(x,y+1

,tab);

return

seed(x+1

,y+1

,tab); --這裡可以用乙個尾呼叫(參考教程中的函式部份),加快遞迴的速度。

end;

end;

---------------------------

----遍歷影象中的所有點

for i=0

,w,1

do

for j=0

,h,1

do---如果是黑色的點,而且沒有被計過數,則呼叫seed函式。

if(tcl[i]

[j]==0

and

(not

tchked[i]

[j])

)then

local

tab =

seed(i,j,tab);

table.insert

(tlines,tab); --新增一條連通線

end;

end;

end;

--現在tlines 裡記錄了的有的連通線,我們現在需要根據連通線的長度排序 

sproc =  function

(l,l2)

return

table

.maxn(l) > table

.maxn(l2);--長的連通線排到前面

end;

table

.sort

(tlines,sproc)

--把影象全部畫成白色的點     

for i=0

,w,1

do

for j=0

,h,1

do

img:setpos( i , j, 16777215

);end

;end

;--然後把最長的一條連通線畫上去

for i,point in

ipairs

(tlines[1]

)do

img:setpos( point.x, point.y , 0

);  

end;

--如果需要去掉周圍的空白

if(crop)

then

local

n = table

.maxn(tlines[1]

)--排序最長連通線中的所有座標點

sproc =  function

(pt,pt2)

return

(pt.x );--*左的排前面

end;

table

.sort

(tlines[

1],sproc);

local

x,x2 = tlines[1]

[1

].x, tlines[1]

[n].x;

--排序最長連通線中的所有座標點

sproc =  function

(pt,pt2)

return

(pt.y );--*上的排前面

end;

table

.sort

(tlines[

1],sproc);

local

y,y2 = tlines[1]

[1

].y, tlines[1]

[n].y;

img:crop( x,y,x2+1

,y2)

end;

end;

種子填充演算法在驗證碼識別中的的應用

模擬精靈識別驗證碼的能用是強大的,乙個函式即可以去除雜色雜點,但是有時候驗證碼中有大量的干擾線,並且位置隨機變動的太歷害,這時候我們在處理驗證碼以前首先去除這些干擾線並準確的去除背景提取字元 下面是乙個模擬精靈初步處理後的驗證碼 已經去除了雜色 雜點 但是上面還是有干擾線 乙個可選的辦法是用中值濾波...

C 下的驗證碼識別

引言 演算法分析 驗證碼識別原理及 演示 for int i 0 i bmpobj.height i 遍歷高度 灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將...

C 下的驗證碼識別

轉 引言 演算法分析 驗證碼識別原理及 演示 c sharp view plain copy print?灰度化之後,畫素的rgb三色都是相同的值了,亮度從0 255 hxff 但用於識別程式,灰度值並不能很好的區分背景色和前景色,尤其是對於漸進的背景來說,所以我們還要將影象進一步處理,就是將灰度2...