MedianBlur(中值滤波/百分比滤波器)
C++原型:
void __stdcall MedianBlur(unsigned char *Src, unsigned char *Dest, int Width, int Height ,int Stride ,int Radius, int Percent)
C#声明:
[DllImport("ImageProcessing.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)] internal static extern void MedianBlur(byte*Src, byte *Dest, int Width, int Height, int Stride, int Radius, int Percent);
VB.NET声明:
<DllImport("ImageProcessing.dll", CallingConvention := CallingConvention.StdCall, CharSet := CharSet.Unicode, ExactSpelling := True)> _ Friend Shared Sub MedianBlur(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 Percent as Integer) End Sub
VB6.0声明:
Private Declare Sub MedianBlur 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 Percent as Long)
函数说明:
/// <summary> /// 实现图像百分比模糊效果,O(1)复杂度,最新整理时间 2014.9.20。
/// 参考论文:Median Filtering in Constant Time。 Simon Perreault and Patrick H´ ebert, IEEE member /// </summary> /// <param name="Src">源图像数据在内存的起始地址。</param> /// <param name="Dest">目标图像数据在内存的起始地址。</param> /// <param name="Width">源和目标图像的宽度。</param> /// <param name="Height">源和目标图像的高度。</param> /// <param name="Radius">模糊的半径,有效范围[1,127],不可大于127。</param> /// <param name="Percent">控制结果图亮度的一个参数,有效范围[0,99],为0时即为最小值,为99时即为最大值,为50时相当于中值滤波。</param> /// <remarks> 1: 能处理8位灰度和24位图像。</remarks> /// <remarks> 2: Src和Dest可以相同,相同时速度稍慢。</remarks> /// <remarks> 3: 对于24位图像,使用多线程方式对每通道数据进行模糊后再组合,对于多核电脑速度能有提升。</remarks> /// <remarks> 4: 算法前后两行的依耐性很强,算法本身不适合于并行。</remarks>
算法效果:
处理速度:
I3 M380 2.53GHZ 笔记本上测试:1000 * 1000 彩色像素,用时125ms(时间是于参数无关的)。
代码情况:
本代码是基于论文提供的ctmf.c中的代码改写并有继续优化的,对于彩色图像,将RGB通道分离成单通道,然后利用多线程对各通道数据分别进行中值模糊,最后再进行合成。
其他说明:
由于采用SSE的相关函数,导致其中的中值的半径值不能大于127(在实际中已经足够用了),如果不用SSE,速度会降低至少一半以上的,该算法的思想可以扩展到其他的一些基于直方图的滤镜中。