最近一个朋友发了一个效果图,是关于条纹去除的,问我有没有什么好的方法,实现这个功能,给我的参考图片如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/22f95f8338a57159d6160218b04aa162.png)
我这里提出两个解决方案:
方案1: 使用带通滤波器,基于FFT的,这个应该是最为标准的答案,详细的参考代码可以见ImageJ软件的BandPass Filer,具体路径为ImageJ\source\ij\plugin\filter\FFTFilter.java。界面如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/20d82016788c583bb1a23f4e49def834.png)
![](https://i-blog.csdnimg.cn/blog_migrate/60420e79c011077ed98ac07d8b15377b.png)
得到的结果大概如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/311e1e08bd552a2a21bc384976773947.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a69dc12abe2ad2f8e8291ef3ec7fc130.jpeg)
其原理就是竖直条纹在频谱图上表现为一条水平线,我们就要把这条水平线消除,反馈到RGB空间就没有条纹了。
![](https://i-blog.csdnimg.cn/blog_migrate/1e2d2eef83d2c60a080bcfaa9ecb38aa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d9dde79d7204b577c1e68d2646f22220.png)
上面的处理后的图像还有些模糊,原因是ImageJ这个插件对其他位置的频谱也处理掉了一些(上面有图的Filter除水平黑线之外的其他黑色区域),如果用于工业实践,可再次适当修改下代码。
在网上另外找了一个测试图像,效果也还算可以:
![](https://i-blog.csdnimg.cn/blog_migrate/a690678b061f1baff842abd2a69c73e1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5e9f36c72212f038f9e812322aeee73c.png)
方案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) ));
这个算法的结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6a7fb1ba288eb2699b192be754408e1c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/063467b28f9dd564596f045fc9ea8f58.jpeg)
对这个图的处理效果还是很不错的。不过他的通用型没有基于FFT的完美,比如上面第二个测试图像,他的结果如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/7d16ce457d300295c1199ee3200e98ce.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e8cd26b26161fba8e54494515d6ca1f4.png)
但是他的优点就是速度非常快,所以还是要根据不同的需求来使用不同的算法把。
本文Demo下载地址: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar,基于FFT的BandPass Filter详见菜单 FFT-> BandPass Filter,基于GIMP那个算法详见:Detection -> Audilairay Enhance-> Destripe菜单。
如果是去除水平条纹,其实也是采用类似的算法。