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

我這里提出兩個解決方案:
方案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選單,
如果是去除水平條紋,其實也是采用類似的演算法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553.html
標籤:其他
上一篇:【短道速滑二】古老的基于亮度平均值的自動Gamma校正演算法。
下一篇:前端可視化-表格-圖形-工具
