GuidedFilter(导向滤波)
C++原型:
void __stdcall GuidedFilter(unsigned char *Src, unsigned char *Guide, unsigned char *Dest, int Width, int Height, int Stride, int Radius, float eps)
C#声明:
[DllImport("ImageProcessing.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)] internal static extern void GuidedFilter(byte* Src, byte* Guide, byte* Dest, int Width, int Height, int Stride, int Radius, float eps);
VB.NET声明:
<DllImport("ImageProcessing.dll", CallingConvention := CallingConvention.StdCall, CharSet := CharSet.Unicode, ExactSpelling := True)> _ Friend Shared Sub GuidedFilter(ByVal Src As IntPtr, ByVal Dest As IntPtr, ByVal Width As Integer, ByVal Height As Integer, ByVal Stride As Integer, ByVal Radius As Integer, Byval eps as Single) End Sub
VB6.0声明:
Private Declare Sub GuidedFilter Lib "ImageProcessing" (ByVal Src As Long, ByVal Dest As Long, ByVal Width As Long, ByVal Height As Long, ByVal StrideAs Long, ByVal Radius As Long, Byval eps as Single)
函数说明:
/// <summary> /// 实现快速的引导滤波,基于<Guided Image Filtering>一文,2014.9.27日整理 /// </summary> /// <param name="Src">图像数据部分在内存中的地址。</param> /// <param name="Guide">引导图的数据在内存中的地址,必须和原图具有相同的格式和大小,也可以直接用原图。</param> /// <param name="Dest">保存处理后的结果的图像数据在内存中的地址,必须和原图具有相同的格式和大小。</param> /// <param name="Width">图像的宽度。</param> /// <param name="Height">图像的高度。</param> /// <param name="Stride">图像的扫描行大小。</param> /// <param name="Radius">控制均值模糊的半径。</param> /// <param name="eps">防止除法部分的溢出,一般可取0.01。</param> /// <remarks> 1、程序的执行时间和算法的参数无关。 </remarks> /// <remarks> 2、Src和Dest可以相同,相同和不同时执行速度无区别。</remarks> /// <remarks> 3、由于方框模糊部分采用了并行编程,因此24位图像处理时没有用并行了,实际的测试表明两者无明显区别。</remarks>
算法效果:
原图 导向图 结果图
处理速度:
I3 M380 2.53GHZ 笔记本上测试:1000 * 1000 彩色像素,用时200ms(时间是于参数无关的)。
代码情况:
本代码是基于论文Guided Image Filtering提供的算法编写优化的,其matlab代码可以从相关的网站上下载到。