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

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

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

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

                             

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章