最近一個朋友發了一個效果圖,是關於條紋去除的,問我有沒有什麼好的方法,實現這個功能,給個人參考圖片以下所示:java
我這裏提出兩個解決方案:算法
方案1: 使用帶通濾波器,基於FFT的,這個應該是最爲標準的答案,詳細的參考代碼能夠見ImageJ軟件的BandPass Filer,具體路徑爲ImageJ\source\ij\plugin\filter\FFTFilter.java。界面以下所示:測試
獲得的結果大概以下所示:spa
其原理就是豎直條紋在頻譜圖上表現爲一條水平線,咱們就要把這條水平線消除,反饋到RGB空間就沒有條紋了。 插件
上面的處理後的圖像還有些模糊,緣由是ImageJ這個插件對其餘位置的頻譜也處理掉了一些(上面有圖的Filter除水平黑線以外的其餘黑色區域),若是用於工業實踐,可再次適當修改下代碼。3d
在網上另外找了一個測試圖像,效果也還算能夠: blog
方案2: 使用GIMP裏的Destripe算法,該算法位於gimp-master\plug-ins\common\destripe.c文件中,其核心過程其實也很簡單,他接受一個輸入參數,窗口寬度,在內部他計算指定寬度內,研圖像高度方向全部像素的平均值,而後以這個平均值和當前像素的差別做爲一個特徵,帶入到後續的一個加強算式中,核心就是下面兩句代碼,這個實際上是用X方向的圖像信息來彌補Y方向的信息的一種手段。圖片
*c = ((sum / cnt - *h) << 10) / *h;ip
*rows = MIN (255, MAX (0, *rows + (*rows * *c >> 10) ));get
這個算法的結果以下:
對這個圖的處理效果仍是很不錯的。不過他的通用型沒有基於FFT的完美,好比上面第二個測試圖像,他的結果以下所示:
可是他的優勢就是速度很是快,因此仍是要根據不一樣的需求來使用不一樣的算法把。
本文Demo下載地址: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,基於FFT的BandPass Filter詳見菜單 FFT-> BandPass Filter,基於GIMP那個算法詳見:Detection -> Audilairay Enhance-> Destripe菜單。
若是是去除水平條紋,其實也是採用相似的算法。