手寫數(shù)字識別系統(tǒng)之圖像分割

背景

本文,主要介紹我之前在學(xué)校時(shí)候,研究的一些跟手寫數(shù)字識別相關(guān)的技術(shù)心得,主要涉及:數(shù)字圖像處理、特征提取、神經(jīng)網(wǎng)絡(luò)等等相關(guān)的一些技術(shù)。。

雖然很多用到的還是網(wǎng)上現(xiàn)有的比較成熟的算法,但是在這些基礎(chǔ)上,我還是有做了不少算法上的改進(jìn)的。。

并且為了寫這個(gè)項(xiàng)目,我當(dāng)時(shí)還特地寫了一整套神經(jīng)網(wǎng)絡(luò)庫,從圖像處理開始到最后的識別過程,沒有使用任何第三方庫,都是從0還是寫起
也沒有用到opencv啊什么的。

上層ui當(dāng)時(shí)用的qt,雖然當(dāng)時(shí)也算是為了跨平臺,但那個(gè)時(shí)候畢竟還是學(xué)生,代碼經(jīng)驗(yàn)欠缺,因此我的基礎(chǔ)庫對跨平臺處理的并不是很好。。

那個(gè)基礎(chǔ)庫,我稍微簡單說下,那是我的第一個(gè)開發(fā)庫,是一個(gè)類似boost的c++模板庫,里面用到了很多c++的模板元編程的特性,但是現(xiàn)在已經(jīng)對c++無愛了,所以早已廢棄不用了。

不過也就是這個(gè)庫的開發(fā),很大程度上影響了我之后的編碼風(fēng)格,也是至此之后,我重點(diǎn)轉(zhuǎn)向了對c的開發(fā)上。。

這套識別系統(tǒng),僅僅是我當(dāng)時(shí)為了學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),拿來練手用的,沒法跟那些成熟的相比,識別率不是很高哈,只能給大家用來參考學(xué)習(xí)了。

簡介

本文在基本BP算法和數(shù)字圖像與處理的基礎(chǔ)上,通過改進(jìn)網(wǎng)絡(luò)、圖像處理算法,并結(jié)合實(shí)踐來探索如何實(shí)現(xiàn)具有高魯棒的、高精度的、高效率的脫機(jī)數(shù)字識別。

在這我主要研究脫機(jī)單體數(shù)字識別,其主要步驟為:

overview_1

數(shù)字樣本的采集

主要采用5行10列的數(shù)字樣本規(guī)格。采集方式是通過掃描樣本卡片來獲取圖像,也盡量避免樣本了的失真,如圖:

overview_2

圖像二值化

主要采用全局閾值分割法和自適應(yīng)的局部閾值分割法,來實(shí)現(xiàn)在不同亮度背景下的自適應(yīng)分割,并對結(jié)果進(jìn)行比對。

數(shù)字提取

目前主要考慮聚類法、矩陣式分割法、連通區(qū)域標(biāo)記法,并比較其優(yōu)劣,選取效果最好的一種算法。

圖像歸一化

主要采用雙線性內(nèi)插和最鄰近內(nèi)插來實(shí)現(xiàn)放大,為了減少圖像在收縮時(shí)帶來的失真,目前打算采用求平均法來實(shí)現(xiàn)。

特征提取

主要采用逐像素提取法,PCA主成分提取兩種方法來實(shí)現(xiàn)。

樣本學(xué)習(xí)

主要采用基于BP算法(反向傳播學(xué)習(xí)算法)的神經(jīng)網(wǎng)絡(luò)進(jìn)行識別,并對BP進(jìn)行一定的改進(jìn)和優(yōu)化,來改進(jìn)訓(xùn)練效果并且適當(dāng)?shù)奶岣哂?xùn)練速率。

目前,針對BP的改進(jìn)算法,主要采添加動(dòng)量項(xiàng)和自適應(yīng)步長法。

而對于BP算法,其主要步驟為:

    前向計(jì)算=〉反向計(jì)算=〉權(quán)值修正=〉循環(huán)迭代

為了進(jìn)一步改進(jìn)網(wǎng)絡(luò),實(shí)現(xiàn)高精度、高效率的識別,打算考慮采用多網(wǎng)絡(luò)集成法,來進(jìn)行優(yōu)化。
主要針對不同權(quán)值、隱層數(shù)的基本BP網(wǎng)絡(luò)進(jìn)行集成。通過每個(gè)網(wǎng)絡(luò)分類的結(jié)果進(jìn)行加權(quán)輸出,來達(dá)到有效的分類。

閾值分割

閾值分割法是一種基于區(qū)域的圖像分割技術(shù),其基本原理是:通過設(shè)定不同的特征閾值,把圖像像素點(diǎn)分為若干類。

在本文中,我們主要處理針對兩類的分割,令閾值為T,圖像像素對應(yīng)的灰度級為f(x, y),那么經(jīng)閾值分割后的圖像g(x, y)定義為:

split_1

因此,標(biāo)記為1的像素對應(yīng)于對象,也就是前景,而標(biāo)記為0的對象對應(yīng)于背景,也就是我們通常所說的圖像二值化。

利用閾值分割進(jìn)行圖像二值化的主要難題就是閾值的選取,事實(shí)證明,閾值的選擇的恰當(dāng)與否對分割的效果起著決定性的作用。

常用的閾值分割方法有以下三種:

整體閾值法

利用整幅圖像的信息對圖像求出最優(yōu)閾值, 在二值化分割過程中只使用這一個(gè)固定閾值,因此計(jì)算量小,但對于亮度條件不好的圖像的分割效果較差。

局部閾值法

它是把原始圖像分為幾個(gè)小的子圖像,再對每個(gè)子圖像求出最佳閾值。因此效果較好,但開銷較大,且局部大小不太好確定,太小容易失真,太大效果不顯著。

動(dòng)態(tài)閾值法

它的閾值求取方法不僅取決于該像素的灰度值及其領(lǐng)域內(nèi)像素灰度值, 而且還與像素的坐標(biāo)位置有關(guān), 這種方法靈活性大, 但是復(fù)雜度高, 計(jì)算量和時(shí)間開銷都比較大。

而岡薩雷斯寫的那本書數(shù)字圖像處理里面,給出了一種最小誤差閾值,通過利用共軛梯度法對灰度直方圖進(jìn)行雙峰的高斯密度曲線進(jìn)行擬合,求取最佳閾值,效果相當(dāng)好,但是計(jì)算太大,而且對于雙峰不顯著的圖像比較難處理,還需進(jìn)行附加的單峰檢測,并進(jìn)行插值處理,由于過于復(fù)雜且實(shí)現(xiàn)也相當(dāng)困難。

split_2

而本文采用具有自適應(yīng)性的OTSU局部閾值法來分割圖像,并對OTSU和局部閾值法進(jìn)行了改進(jìn),不僅提高了性能而且改善了分割效果,對于亮度不均勻的圖像也能實(shí)現(xiàn)較好的分割。

最大類間方差法(OTSU)

由Otsu于1978年提出的最大類間方差法以其計(jì)算簡單、穩(wěn)定有效,一直廣為使用。其主要思想就是選取閾值使其類內(nèi)方差最小化或類間方差最大化。Otsu算法不僅計(jì)算簡單,而且能夠應(yīng)用于多閾值確定,因此可以說是一種相當(dāng)好的閾值選取方法。
我們通常采用最大化類間方差,來實(shí)現(xiàn)閾值分割,其類間方差定義為:

otsu_1

其中

|| u || 圖像中總的灰度均值 ||
|| u1 || 圖像中小于閾值T的像素灰度均值 ||
|| u2 || 圖像中大于閾值T的像素灰度均值 ||
|| n1 || 圖像中小于閾值T的像素?cái)?shù) ||
|| n2 || 圖像中大于閾值T的像素?cái)?shù) ||

因此,只需通過遍歷256個(gè)灰度級,尋找使其類間方差最大的那個(gè)灰度值就是最佳閾值T。

OTSU的實(shí)現(xiàn)與改進(jìn)

然而如果每次遍歷都需要重新計(jì)算閾值兩邊的均值與像素?cái)?shù)的話計(jì)算量是相當(dāng)大的,如果能夠在下次遍歷時(shí)利用上次計(jì)算的結(jié)果,那么計(jì)算量可以大大減少。
假設(shè)灰度直方圖為,圖像總均值為,圖像總像素?cái)?shù)為,那么其遞推方式如下:

otsu_2

為了進(jìn)一步簡化計(jì)算,我們可以通過用
otsu_3

來替換,得到

otsu_4

由于n在遞歸中不變可以省略,因此可以改為

otsu_5

由于本文是針對字符圖像的分割,由于字符的筆畫通常較細(xì),通常只占圖像的1/4都不到,因此可以適當(dāng)?shù)恼{(diào)整閾值,以實(shí)現(xiàn)較好的分割效果,改進(jìn)后的閾值為

otsu_6

局部閾值的實(shí)現(xiàn)與改進(jìn)

然而在實(shí)際圖像中, 由于噪聲或其他干擾等因素的影響,OTSU閾值分割并不能使圖像分割得到滿意的結(jié)果, 往往會(huì)產(chǎn)生嚴(yán)重的分割錯(cuò)誤。這是因?yàn)閳D像的灰度直方圖分布不一定
出現(xiàn)明顯的峰和谷, 像素灰度值僅僅反映了像素灰度級的幅值大小, 并沒有反映出像素與鄰域的空間相關(guān)信息。

通過具體的實(shí)驗(yàn)發(fā)現(xiàn):

當(dāng)圖像亮度分布不均勻時(shí),往往無法得到好的分割效果,通常會(huì)出現(xiàn)大塊的黑塊,或者過渡分割而丟失信息的情況。

因此,可以通過對圖像進(jìn)行分塊,針對每一小塊進(jìn)行OTSU分割,可以減少這些情況的發(fā)生,但是這又會(huì)出現(xiàn)不希望的“棋盤”效果,為了避免這種情況的發(fā)生,可以采用如下改進(jìn)的局部閾值算法:

遍歷圖像中每一像素,在該像素的鄰域內(nèi)進(jìn)行灰度統(tǒng)計(jì),計(jì)算OTSU閾值,并僅對該點(diǎn)進(jìn)行閾值分割。

這樣就能在較好的分割效果下實(shí)現(xiàn)像素平滑過渡,避免了“棋盤”效應(yīng),由于在當(dāng)像素移動(dòng)時(shí),只有一行或一列改變,所以可以在每步移動(dòng)中,以新數(shù)據(jù)更新前一個(gè)位置得到的直方圖,從而避免了每次重新計(jì)算整個(gè)直方圖,大大減少了計(jì)算量,使其在一個(gè)可接受的范圍內(nèi)。

為了防止部分區(qū)域受到噪聲干擾而產(chǎn)生的黑塊現(xiàn)象,可以在進(jìn)行局部閾值處理前,進(jìn)行三階的平滑處理,效果相當(dāng)顯著。

結(jié)果

原圖

split_3

經(jīng)全局閾值處理后的圖象

split_4

經(jīng)改進(jìn)的局部閾值處理后的圖像

split_5

總結(jié)

由上圖可見,經(jīng)改進(jìn)的局部閾值處理后的圖像的效果還是相當(dāng)明顯的,可是還是有些不足之處。。

就是處理后的圖像筆畫較粗,容易填掉數(shù)字中的空洞,尤其是4,6,8,9這些含有小孔的數(shù)字,這些都有待進(jìn)一步改進(jìn)。

后續(xù),我還會(huì)總結(jié)下:傾斜矯正、數(shù)字提取、特征提取、神經(jīng)網(wǎng)絡(luò)相關(guān)的一些心得和改進(jìn)算法。。

最后,再貼兩張hnr項(xiàng)目,界面截圖哈。。

before

after

個(gè)人主頁:TBOOX開源工程
原文出處:http://www.tboox.org/cn/2016/07/28/hnr-split-image/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容