LinearBlur(线性模糊)
C++原型:
void __stdcall LinearBlur(unsigned char *Src, unsigned char *Dest, int Width,int Height,int Stride, int Radius, int EdgeBehavior)
C#声明:
[DllImport("ImageProcessing.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)] internal static extern void LinearBlur(byte* Src, byte *Dest, int Width, int Height, int Stride, int Radius, int EdgeBehavior);
VB.NET声明:
<DllImport("ImageProcessing.dll", CallingConvention := CallingConvention.StdCall, CharSet := CharSet.Unicode, ExactSpelling := True)> _ Friend Shared Sub LinearBlur(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 EdgeBehavior as Integer) End Sub
VB6.0声明:
Private Declare Sub LinearBlur Lib "ImageProcessing" (ByVal Src As Long, ByVal Dest As Long, ByVal Width As Long, ByVal Height As Long, ByVal Stride As Long, ByVal Radius As Long, byval EdgeBehavior as Long)
函数说明:
/// <summary> /// 实现图像线性模糊效果,O(1)复杂度,最新整理时间 2014.9.19。 /// </summary> /// <param name="Src">源图像数据在内存的起始地址。</param> /// <param name="Dest">目标图像数据在内存的起始地址。</param> /// <param name="Width">源和目标图像的宽度。</param> /// <param name="Height">源和目标图像的高度。</param> /// <param name="Stride">图像的扫描行大小。</param> /// <param name="Radius">方框模糊的半径,有效范围[1,1000]。</param> /// <param name="EdgeBehavior">边缘处数据的处理方法,0表示重复边缘像素,1使用镜像的方式对边缘像素求均值。</param> /// <remarks> 1: 能处理8位灰度和24位图像。</remarks> /// <remarks> 2: Src和Dest可以相同,相同和不同速度上无区别。</remarks> /// <remarks> 3: 使用了多线程,可加快执行速度。</remarks>
算法效果:
处理速度:
I3 M380 2.53GHZ 笔记本上测试:1000 * 1000 彩色像素,用时25ms(时间是于参数无关的)。
代码情况:
本算法是基于Paint.net(早期版本,至少3.0以前的是这样的)中的高斯模糊代码(其实那个不是真正的高斯模糊)改写的,改写的代码实现了算法速度和参数无关(Paint.net是有关的)。在PC上没有使用并行版本,但该算法有适合的并行算法。
其他说明:
相对于BoxBlur,LinearBlur 的模糊效果过渡更加自然,其效果介于GuassBlur和BoxBlur之间,并且其算法内部无浮点计算,对于需要效果较好又不想有太多浮点优化的场合比较有用,比如FPGA中。
BoxBlur/LinearBlur/GuassBlur权重曲线示例