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

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

  本文結合工程實踐,提出三種不一樣的背景漂白算法,分享給你們。算法

   1、PhotoCopy算法網絡

  這是Photoshop軟件裏的一個內嵌算法,中文名字叫影印,PS的幫助文檔對其專業的解釋爲:測試

  「影印」濾鏡模擬影印圖像的效果。較大區域的暗度會致使僅在其邊緣的周圍進行拷貝,而且半調會背離純黑或純白。能夠設置細節和暗度的色階。字體

  看完,不知所云啊。優化

  通過測試,在PS中影印算法的結果是和背景色和前景色的設置有關的,在文本圖像的應用中,前景色設置爲黑色(字體的顏色),背景色爲白色(紙張的顏色),此時就能夠獲取一個基本的漂白效果了,以下所示:spa

  

                   原圖                                                                                       影印效果(細節參數10,暗度參數10)3d

  能夠看到,漂白後的圖背景部分有很多噪點,這個能夠在執行影印前進行一些簡單的去噪操做,好比DCT去作,或者其餘的一些保邊去噪算法(文字較之背景通常都是強邊緣的)。code

  下面是通過了局部拉普拉斯去燥後的圖已經用相同參數執行影印後的效果。htm

   

              去噪後                                    再次執行影印

  明顯,這樣處理後黑色的噪點少了不少,總體看起來更爲完美。

  關於影印算法的實現,其基礎是高斯模糊,經過比較高斯模糊和原圖以前的差別,再放大必定的倍數,而後用獲得的結果做爲權重,在背景和前景之間進行融合。這是個很容易實現和優化的算法。

  在有文字區域,模糊的值和原圖的差別較爲明顯,通過放大後,權重就較大,這個時候就顯示爲前景色,在其餘區域,差別較小,權重小,結果就靠近背景色。

  2、網絡上分享的一個背景移除算法

  具體的能夠在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):

                             

相關文章
相關標籤/搜索