最近一個朋友發了一個效果圖,是關於條紋去除的,問我有沒有什么好的方法,實現這個功能,給我的參考圖片如下所示:

我這里提出兩個解決方案:
方案1: 使用帶通濾波器,基於FFT的,這個應該是最為標准的答案,詳細的參考代碼可以見ImageJ軟件的BandPass Filer,具體路徑為ImageJ\source\ij\plugin\filter\FFTFilter.java。界面如下所示:

得到的結果大概如下所示:

其原理就是豎直條紋在頻譜圖上表現為一條水平線,我們就要把這條水平線消除,反饋到RGB空間就沒有條紋了。

上面的處理后的圖像還有些模糊,原因是ImageJ這個插件對其他位置的頻譜也處理掉了一些(上面有圖的Filter除水平黑線之外的其他黑色區域),如果用於工業實踐,可再次適當修改下代碼。
在網上另外找了一個測試圖像,效果也還算可以:

方案2: 使用GIMP里的Destripe算法,該算法位於gimp-master\plug-ins\common\destripe.c文件中,其核心過程其實也很簡單,他接受一個輸入參數,窗口寬度,在內部他計算指定寬度內,研圖像高度方向所有像素的平均值,然后以這個平均值和當前像素的差異作為一個特征,帶入到后續的一個增強算式中,核心就是下面兩句代碼,這個其實是用X方向的圖像信息來彌補Y方向的信息的一種手段。
*c = ((sum / cnt - *h) << 10) / *h;
*rows = MIN (255, MAX (0, *rows + (*rows * *c >> 10) ));
這個算法的結果如下:

對這個圖的處理效果還是很不錯的。不過他的通用型沒有基於FFT的完美,比如上面第二個測試圖像,他的結果如下所示:
但是他的優點就是速度非常快,所以還是要根據不同的需求來使用不同的算法把。
本文Demo下載地址: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,基於FFT的BandPass Filter詳見菜單 FFT-> BandPass Filter,基於GIMP那個算法詳見:Detection -> Audilairay Enhance-> Destripe菜單。
如果是去除水平條紋,其實也是采用類似的算法。
