天天看點

【工程應用三】三種不同的文本圖像背景漂白/純化/去除算法。

文本圖像在圖像處理的應用中也是占用了一個比較大的比例,特别是随着對基礎教育的越來越重視,在學生的一些輔助教育、智能化作業批改等等方面的需求迅速增長。目前是市面上也已經有了很多這方面比較專業的軟體。在這方面的算法當中,一個比較重要的過程就是對文本圖像背景的純化,也有叫漂白或者背景去除的,因為背景複雜了後,對于後續的二值化、識别等都會帶來不利的影響。

      文本圖像在圖像處理的應用中也是占用了一個比較大的比例的,特别是随着現在對基礎教育的越來越重視,對學生的一些輔助教育、智能化作業批改等等方面的需求迅速增長。目前是上面也已經有了很多這方面比較專業的軟體。在這方面的算法那當中,一個比較重要的過程就是對文本圖像背景的純化,也有叫漂白或者叫背景去除的,因為背景複雜了後,對于後續的二值化、識别等都會帶來不利的影響。

  本文結合工程實踐,提出三種不同的背景漂白算法,分享給大家。

   一、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):

【工程應用三】三種不同的文本圖像背景漂白/純化/去除算法。