《Detecting Text in Natural Scenes with Stroke Width Transform》煞额,這是微軟公司的一篇發(fā)表于CVPR2010的文章饲趋,使用傳統(tǒng)方法來檢測自然場景中的文本洲愤。代碼地址:https://github.com/aperrau/DetectText
因?yàn)樗闶且粋€比較經(jīng)典的文章颅痊,所以看完記錄一下。當(dāng)然github還有其他版本的實(shí)現(xiàn)代碼彻犁,上面的代碼幾乎和原文的原理一樣叫胁,方便和文章一起閱讀,因此放在這汞幢。
下面根據(jù)原文的結(jié)構(gòu)和上述提供的代碼詳細(xì)的解讀一下該算法
總的來說該算法分為四步:
- 利用canny算子檢測圖片的邊界
- 筆畫寬度變換-Stroke Width Transform(這一步輸出的圖像我們稱為SWT圖像)
- 通過SWT圖像得到多個連通域
- 通過自定義的規(guī)則過濾一些連通域驼鹅,得到候選連通域
- 將連通域合并得到文本行
一、利用canny算子檢測圖片的邊界
這步不用多說森篷,基礎(chǔ)的圖像處理知識输钩,利用OpenCV 的Canny函數(shù)可以得到圖片邊緣檢測的結(jié)果。
二疾宏、筆畫寬度變換(Stroke Width Transform)
先要劇透一點(diǎn)张足,也是需要明確的一點(diǎn),這一步輸出圖像和輸入圖像大小一樣坎藐,只是輸出圖像像素為筆畫的寬度,具體如下。
如上圖所示岩馍,通過邊緣檢測得到上圖a碉咆,假設(shè)現(xiàn)在從邊緣上的點(diǎn)p開始,根據(jù)p點(diǎn)梯度的反方向找到邊緣另一邊的點(diǎn)q蛀恩,如果p點(diǎn)的梯度與q點(diǎn)梯度的反方向夾角在之間疫铜,那么這兩點(diǎn)間的距離為一個筆畫寬度,那么p點(diǎn)和q點(diǎn)以及它們之間的像素在SWT輸出圖像中對應(yīng)位置的值為p和q點(diǎn)的距離大小双谆。
按照上述的計(jì)算方法會有兩種情況需要考慮壳咕。如下圖所示,
下圖a表示一個筆畫中的像素可能得到兩個筆畫寬度顽馋,這種情況下將紅點(diǎn)出的筆畫寬度設(shè)置為最小的那個值谓厘,下圖b表示當(dāng)一個筆畫出現(xiàn)更為復(fù)雜情況,b圖中的紅點(diǎn)計(jì)算出的兩個筆畫寬度用兩個紅線表示寸谜,這兩紅線都無法真正表示筆畫的寬度竟稳,這時候筆畫寬度取這里面所有像素計(jì)算得到的筆畫寬度的中值作為紅點(diǎn)出的筆畫寬度。
因?yàn)橛形淖直缺尘案梁捅尘氨任淖指羶煞N情況熊痴,這樣會導(dǎo)致邊緣的梯度方向相反他爸,所以這一個步驟要執(zhí)行兩遍。這個步驟結(jié)束后得到一張SWT圖像果善。
三诊笤、通過SWT圖像得到多個連通域
在通過上述步驟得到SWT輸出圖像后,該圖像大小與原圖像大小一致巾陕,圖像中的像素值為對應(yīng)像素所在筆畫的寬度(下面稱為SWT值)√指現(xiàn)將相鄰像素SWT值比不超過3.0的歸為一個連通域。這樣就能得到多個連通域惜论。
四许赃、過濾連通域
上述步驟輸出的多個連通域中,并不是所有的連通域都被認(rèn)為是筆畫候選區(qū)域馆类,需要過濾一些噪聲的影響混聊,過濾的規(guī)則有:
- 如果某連通域的方差過大(方差大于連通域的一半為方差過大為過大),則認(rèn)為該連通域不是有效的
- 如果某連通域過大(寬大于300)或者過星伞(寬小于10)句喜,則認(rèn)為該連通域不是有效的(代碼中只過濾了過大的連通域,連通域的長寬為連通域外接矩形的長寬)
- 如果某連通域的長寬比不在0.1-10的范圍內(nèi)沟于,則認(rèn)為該連通域不是有效的(連通域的長寬為連通域外接矩形的長寬)
- 如果某連通域的外接矩形包含其他兩個連通域咳胃,則認(rèn)為該連通域不是有效的(代碼中判定,如果某個連通域的外接矩形包含兩個或兩個以上連通域外接矩形的中心時旷太,認(rèn)為其包含了兩個連通域)
上述條件都滿足的連通域展懈,認(rèn)為是筆畫候選區(qū)域销睁,用于輸入給下一步操作。
五存崖、將連通域合并得到文本行
文中認(rèn)為冻记,在自然場景中,一般不會只有單個字母出現(xiàn)来惧,所有將連通域合并為文本有利于進(jìn)一步將噪聲排除冗栗。
當(dāng)兩個連通域滿足下面條件時,認(rèn)為這兩個連通域是一對:
- 兩個連通域中值的比小于2.0(連通域中值供搀,指的是連通域中所有像素值的中值)
- 兩個連通域高的比小于2.0(連通域的高隅居,指其外界矩形的高)
- 兩個連通域之間的距離小于較寬的連通域?qū)挾鹊?倍(連通域之間的距離為連通域外界矩形中心點(diǎn)之間的距離)
- 兩個連通域的顏色相似(代碼用兩個連通域?qū)?yīng)于原圖區(qū)域的像素均值代表該連通域的顏色)
得到兩兩連通域組成的多對連通域后,如果有兩對連通域有共享的連通域葛虐,共享的連通域都在連通域?qū)Φ囊欢耍催B通域的首端或者尾端)胎源,且方向相同(方向用一個連通域中心到另一個連通域中心的方向),就將這兩對連通域合并為一個新的連通域組挡闰,依次進(jìn)行乒融,知道沒有連通域?qū)π枰喜t合并結(jié)束。
最后將合并完的結(jié)果中濾除小于3的連通域的連通域組得到的最終結(jié)果摄悯,認(rèn)為是一行文字赞季。
到這里SWT的文字檢測算法就介紹完了。
歡迎加入OCR交流群:785515057(此群已滿)
歡迎加入OCR交流群2:826714963
參考
1.《Detecting Text in Natural Scenes with Stroke Width Transform》
2.https://sites.google.com/site/roboticssaurav/strokewidthnokia
3.https://github.com/aperrau/DetectText
4.https://www.cnblogs.com/dawnminghuang/p/3807678.html