今天朋友給了一些拍照的文字圖像,由於噪音以及JPG編碼等因素的影響啊,在線條、文字等邊緣的部位放大後查看可以看到有明顯的彩色的斑點,這個對於後續的識別和處理都是不利的,因此,需要在進一步處理前把他們給去除掉,這裏經過測試提出一個簡單的算法,經過測試,還是有一定的效果的。
原圖放大 Deinterlace處理後放大
如上圖所示,可以看到,在黑色線條和文字周邊存在彩色 的色斑,要想辦法儘量把這些彩色色斑去除,並且不影響整體的視覺效果。
這個嘛,首先得看看我現有的算法是否有比較合適的結果的,找來找去,也就看到有個Deinterlace(去除交錯)有點意思,但是觀察呢發現,有幾個問題,一個是整體變得模糊了一些,第二呢,就是一些不需要改變的區域也改變了。
這裏提出一個改進的思路,就是我們觀察,這類圖像啊,周邊的彩色噪點他的飽和度都比較高,而正常位置差異比較小,因此,可以通過飽和度的值來初步判斷這個要處理的區域。
飽和度呢不要直接拿那個HSL模型裏直接計算飽和度的公式去處理,而是隻要計算RGB像素的最大值和最小值的差異,如果直接用差異大於某個閾值,判定那些區域需要處理的話,結果又會有很多過渡不自然的地方,因此,想到一種方法是用這個差異做權重,
並且為了可調節效果,還可以把這個差異按照參數在放大。
即類似於下面的結果:
Diff = max(b,g,r)-min(b,g,r);
W = 255 - Diff * cof;
if (W < 0) W = 0;
InvW = 255 - W;
Result = Src * W + Deinterlace * InvW;
Cof = 1 Cof = 2
這種方法對於傾斜的彩色斑點的效果就要稍微弱一些,但是依舊是個不錯的解決方案,當然,如果彩色斑點的寬度超過3個像素,估計就要不好弄了。
本文Demo下載地址: https://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,本算法位於Detection(檢測相關)--》彩色斑點去除 菜單下,裏面的所有算法都是基於SSE實現的。