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

Imageshop發表於2021-04-08

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

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

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

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

相關文章