文本影像在影像處理的應用中也是占用了一個比較大的比例的,特別是隨著現在對基礎教育的越來越重視,對學生的一些輔助教育、智能化作業批改等等方面的需求迅速增長,目前是上面也已經有了很多這方面比較專業的軟體,在這方面的演算法那當中,一個比較重要的程序就是對文本影像背景的純化,也有叫漂白或者叫背景去除的,因為背景復雜了后,對于后續的二值化、識別等都會帶來不利的影響,
本文結合工程實踐,提出三種不同的背景漂白演算法,分享給大家,
一、PhotoCopy演算法
這是Photoshop軟體里的一個內嵌演算法,中文名字叫影印,PS的幫助檔案對其專業的解釋為:
“影印”濾鏡模擬影印影像的效果,較大區域的暗度會導致僅在其邊緣的周圍進行拷貝,并且半調會背離純黑或純白,可以設定細節和暗度的色階,
看完,不知所云啊,
經過測驗,在PS中影印演算法的結果是和背景色和前景色的設定有關的,在文本影像的應用中,前景色設定為黑色(字體的顏色),背景色為白色(紙張的顏色),此時就可以獲取一個基本的漂白效果了,如下所示:

原圖 影印效果(細節引數10,暗度引數10)
可以看到,漂白后的圖背景部分有不少噪點,這個可以在執行影印前進行一些簡單的去噪操作,比如DCT去做,或者其他的一些保邊去噪演算法(文字較之背景一般都是強邊緣的),
下面是經過了區域拉普拉斯去燥后的圖已經用相同引數執行影印后的效果,

去噪后 再次執行影印
明顯,這樣處理后黑色的噪點少了很多,整體看起來更為完美,
關于影印演算法的實作,其基礎是高斯模糊,通過比較高斯模糊和原圖之前的差異,再放大一定的倍數,然后用得到的結果作為權重,在背景和前景之間進行融合,這是個很容易實作和優化的演算法,
在有文字區域,模糊的值和原圖的差異較為明顯,經過放大后,權重就較大,這個時候就顯示為前景色,在其他區域,差異較小,權重小,結果就靠近背景色,
二、網路上分享的一個背景移除演算法
具體的可以在https://www.cnblogs.com/jsxyhelu這個大俠的博客中查找, 這個演算法的基礎其實也是高斯模糊,一個簡答的代碼如下所示:
for (int Y = 0; Y < Height * Width; Y++) { if (Blur[Y] != 0)
{
Dest[Y] = IM_ClampToByte(Src[Y] * 255 / Blur[Y]);
} }
這里的Blur通常也是取的高斯模糊的結果,
這是一個非常簡單的代碼,也是可以很高效的實作的,通常需要一個比較大的模糊,比如100左右,


原圖 處理后的效果
這個演算法在此類影像中能夠成功的核心是:在原圖中比較黑的文字部分,占用的整體是比較少的,當大半徑模糊時,模糊的值是接近紙張之類的顏色的,也就是比較靠近白色,所以結果基本上沒什么變化,而紙張那些地方的顏色,因為模糊的值和他們的原始值基本差不多,所以Src/Blur基本接近1,在乘以255,所以結果就變為白色了,
可以看出,這個演算法那其實和PhotoCopy有所類似,都是比較模糊和原圖的差異,只是一個用的減法,一個用的是除法,
但是這個演算法有一個好處,他能夠很好地保留原始文本影像的一些彩色資訊,而不會出現不自然的現象,不過如果直接這個演算法出來的結果還是有點對比度不夠,后期在適當的增加點對比度效果會很不錯,
比如下圖,就是在處理后對比度增加了30的效果,而且紅色文字和藍色的LOGO得到了很好的保留,

三、一個基于區域方差和均值的改進演算法
我們知道,在區域二值演算法中,Sauvola二值化一直是個標桿演算法,他比opencv自帶的自適應二值化有著更為穩定和可靠的效果,而且他也有快速的O(1)演算法,其基本的原理和計算公式如下:
某點(x,y)處的均值和方差運算式為:

則該點的二值化的閾值為:

其中 k為修正系數,有效范圍[0,1], R可取定值128,
如果直接這樣寫,就成了2值化了,但是現在有很多庫其實不是需要二值化的結果的,他需要的是一個比較純凈的圖,實際上還是包含了很多邊緣資訊的,
我們采用了一種方法,首先閾值確定處理方式為取那些值大于平均值的像素和平均值的方差加上平均值,即為T,然后在提供一可調引數D,當像素值大于T-D,則結果為白色,如果小于T-D,則考慮不能直接設定為黑色,我們根據影像內容計算某一個BaseValue,當像素值小于T-D-BaseValue,則為黑色,如果在他們之間,則進行一個線性的量化,按照大小量化到0和255之間,以便讓顏色有一個線性的變化,不會產生特別突兀的效果,
如果對每個像素都采用上述方式進行處理,則處理的速度會非常的緩慢,因為這個程序不想普通的Sauvola可以剔除前后依賴關系,因此,一種加速的方式就是采用類似CLAHE演算法一樣,對影像直接分塊,分塊后單獨計算某一個塊的引數,然后可采用雙線性插值計算出塊內其他位置的相關引數,當然還有一種方式就是用這些分塊點采用更為復雜的插值或者擬合出一個曲面,然后獲取引數,這樣做的計算時間也會要稍微復雜一些,但是對于一些邊緣你的過渡要稍微好一點,
通常,塊的大小對結果的影響不是很明顯,但是還有區別,建議塊的大小可取16和32之間,
我們測驗了一些圖片,感覺這個演算法的效果還是非常不錯的,


測驗一張有著嚴重影印的圖片也能通過調節引數得到不錯的結果:

這三個演算法應該說各有千秋,PhotoCopy的容錯性很不錯,但是似乎噪點有點多(不過PhotoCopy還有很多其他的特殊作用),jsxyhelu的那個呢也很不錯,速度快,效果也還行,還能完美的保證彩色不丟失,基于方差的在整體的對比度方面有著更為顯著的效果,而且對區域陰影也有很不錯的過濾作用,
在我的SSE Demo里也集成了上述三個演算法,分別位于Styleize --> PhotoCopy、Detection->Auxliary->RemoveBackGround以及Detection->Auxliary->PureGround選單下, PureGround還有一些其他的選項,如下圖所示:

可在此處下載Demo: https://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar
國內也有人針對此需求開發一些比較專業的軟體,如果有此需求的我推薦此人的博客:https://www.cnblogs.com/Charltsing/p/PictureCleaner.html,可以直接免費使用,而且支持批處理等等比較實用的功能,如下圖所示:

如果想時刻關注本人的最新文章,也可關注公眾號(Imageshop):

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273991.html
標籤:其他
上一篇:格林童話之祖父和孫子
