天天看點

【短道速滑三】去除圖像豎直(垂直)條紋算法

介紹兩種去除圖像豎直條紋的簡單算法。

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

【短道速滑三】去除圖像豎直(垂直)條紋算法

   我這裡提出兩個解決方案:

      方案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菜單。

  如果是去除水準條紋,其實也是采用類似的算法。