原文:Win8Metro(C#)数字图像处理--2.10图像中值滤波



[函数名称]

图像中值滤波函数MedianFilterProcess(WriteableBitmap
src)

[函数代码]

///<summary>

///
Median filter process.

///</summary>

///<param
name="src">Source image.</param>

///<returns></returns>

publicstaticWriteableBitmap
MedianFilterProcess(WriteableBitmap src)////10中值滤波处理

{

if(src!=null
)

{

int
w = src.PixelWidth;

int
h = src.PixelHeight;

WriteableBitmap
filterImage =newWriteableBitmap(w,
h);

byte[]
temp = src.PixelBuffer.ToArray();

byte[]
tempMask = (byte[])temp.Clone();

int
v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0, v7 = 0, v8 = 0, t = 0;

for
(int j = 1; j < h - 1; j++)

{

for
(int i = 4; i < w * 4 - 4; i += 4)

{

v1 = (int)(temp[i
- 4 + (j - 1) * w * 4] * 0.114 + temp[i - 4 + 1 + (j - 1) * w * 4] * 0.587 + temp[i - 4 + 2 + (j - 1) * w * 4] * 0.299);

v2 = (int)(temp[i
+ (j - 1) * w * 4] * 0.114 + temp[i + 1 + (j - 1) * w * 4] * 0.587 + temp[i + 2 + (j - 1) * w * 4] * 0.299);

v3 = (int)(temp[i
+ 4 + (j - 1) * w * 4] * 0.114 + temp[i + 4 + 1 + (j - 1) * w * 4] * 0.587 + temp[i + 4 + 2 + (j - 1) * w * 4] * 0.299);

v4 = (int)(temp[i
- 4 + j * w * 4] * 0.114 + temp[i - 4 + 1 + j * w * 4] * 0.587 + temp[i - 4 + 2 + j * w * 4] * 0.299);

v5 = (int)(temp[i
+ 4 + j * w * 4] * 0.114 + temp[i + 4 + 1 + j * w * 4] * 0.587 + temp[i + 4 + 2 + j * w * 4] * 0.299);

v6 = (int)(temp[i
- 4 + (j + 1) * w * 4] * 0.114 + temp[i - 4 + 1 + (j + 1) *w * 4] * 0.587 + temp[i - 4 + 2 + (j + 1) * w * 4] * 0.299);

v7 = (int)(temp[i
+ (j + 1) * w * 4] * 0.114 + temp[i + 1 + (j + 1) * w * 4] * 0.587 + temp[i + 2 + (j + 1) * w * 4] * 0.299);

v8 = (int)(temp[i
+ 4 + (j + 1) * w * 4] * 0.114 + temp[i + 4 + 1 + (j + 1) * w * 4] * 0.587 + temp[i + 4 + 2 + (j + 1) * w * 4] * 0.299);

t = GetMedianValue(v1, v2, v3, v4, v5, v6, v7, v8);

if(t==v1)

{

temp[i + j * w * 4] = (byte)tempMask[i
- 4 + (j - 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
- 4 + 1 + (j - 1) * w * 4];

temp[i + 2 + j * w* 4] = (byte)tempMask[i
- 4 + 2 + (j - 1) * w * 4];

}

elseif(t==v2)

{

temp[i + j * w * 4] = (byte)tempMask[i
+ (j - 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
+ 1 + (j - 1) * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
+ 2 + (j - 1) * w * 4];

}

elseif(t==v3)

{

temp[i + j * w * 4] = (byte)tempMask[i
+ 4 + (j - 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
+ 1 + 4 + (j - 1) * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
+ 2 + 4 + (j - 1) * w * 4];

}

elseif(t==v4)

{

temp[i + j * w * 4] = (byte)tempMask[i
- 4 + j * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
- 4 + 1 + j * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
- 4 + 2 + j * w * 4];

}

elseif(t==v5)

{

temp[i + j * w * 4] = (byte)tempMask[i
+ 4 + j * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
+ 4 + 1 + j * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
+ 4 + 2 + j * w * 4];

}

elseif(t==v6)

{

temp[i + j * w * 4] = (byte)tempMask[i
- 4 + (j + 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
- 4 + 1 + (j + 1) * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
- 4 + 2 + (j + 1) * w * 4];

}

elseif
(t == v7)

{

temp[i + j * w * 4] = (byte)tempMask[i
+ (j + 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
+ 1 + (j + 1) * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
+ 2 + (j + 1) * w * 4];

}

else

{

temp[i + j * w * 4] = (byte)tempMask[i
+ 4 + (j + 1) * w * 4];

temp[i + 1 + j * w * 4] = (byte)tempMask[i
+ 4 + 1 + (j + 1) * w * 4];

temp[i + 2 + j * w * 4] = (byte)tempMask[i
+ 4 + 2 + (j + 1) * w * 4];

}

v1 = 0; v2 = 0; v3 = 0; v4 = 0; v5 = 0; v6 = 0; v7 = 0; v8 = 0; t = 0;

}

}

Stream
sTemp = filterImage.PixelBuffer.AsStream();

sTemp.Seek(0,SeekOrigin.Begin);

sTemp.Write(temp, 0, w * 4 * h);

return
filterImage;

}

else

{

returnnull;

}

}

privatestaticint
GetMedianValue(paramsint[]
src)

{

int
w = src.Length;

int
temp = src[0], m = 0;

for
(int i = 1; i < (int)(w
/ 2); i++)

{

if
(src[i] < temp)

{

m = src[i];

src[i] = temp;

temp = m;

}

else

continue;

}

return
(int)((src[(int)(w
/ 2)] + src[(int)(-1 + w / 2)]) / 2);

}


Win8Metro(C#)数字图像处理--2.10图像中值滤波的更多相关文章

  1. Win8Metro(C#)数字图像处理--2.3图像反色

    原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明]     反色公式如下: ...

  2. Win8MetroC#数字图像处理--2.2图像二值化函数

    原文:Win8MetroC#数字图像处理--2.2图像二值化函数 [函数代码] /// <summary> /// Binary process. /// </summary> ...

  3. Win8Metro(C#)数字图像处理--2.4图像颜色聚类

    原文:Win8Metro(C#)数字图像处理--2.4图像颜色聚类  [函数名称] 图像颜色聚类函数ClusterProcess(WriteableBitmap src,int value) [算 ...

  4. Win8Metro(C#)数字图像处理--2.33图像非线性变换

    原文:Win8Metro(C#)数字图像处理--2.33图像非线性变换  [函数名称] 图像非线性变换函数NonlinearTransformProcess(WriteableBitmap src ...

  5. Win8Metro(C#)数字图像处理--2.32图像曝光算法

    原文:Win8Metro(C#)数字图像处理--2.32图像曝光算法  [函数名称] 图像曝光函数ExposureProcess(WriteableBitmap src,int exposureV ...

  6. Win8Metro(C#)数字图像处理--2.27图像加法运算

    原文:Win8Metro(C#)数字图像处理--2.27图像加法运算  [函数名称] 图像加法函数AddProcess(WriteableBitmap src, WriteableBitmap a ...

  7. Win8Metro(C#)数字图像处理--2.28图像乘法运算

    原文:Win8Metro(C#)数字图像处理--2.28图像乘法运算  [函数名称] 图像乘法函数MultiplicationProcess(WriteableBitmap src, Writea ...

  8. Win8Metro(C#)数字图像处理--2.29图像除法运算

    原文:Win8Metro(C#)数字图像处理--2.29图像除法运算  [函数名称] 图像除法函数DivisionProcess(WriteableBitmap src, WriteableBit ...

  9. Win8Metro(C#)数字图像处理--2.26图像减法

    原文:Win8Metro(C#)数字图像处理--2.26图像减法  [函数名称] 图像减法函数SubtractionProcess(WriteableBitmap src, WriteableBi ...

随机推荐

  1. 【codeforces 755B】PolandBall and Game

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. 【codeforces 755D】PolandBall and Polygon

    time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【codeforces 755C】PolandBall and Forest

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. arm-linux内存管理学习笔记(1)-内存页表的硬件原理

    linux kernel集中了世界顶尖程序猿们的编程智慧,犹记操作系统课上老师讲操作系统的四大功能:进程调度 内存管理 设备驱动 网络.从事嵌入式软件开发工作,对设备驱动和网络接触的比較多. 而进程调 ...

  5. php实现 明明的随机数

    php实现 明明的随机数 一.总结 一句话总结: 1.asort是干嘛的? asort — 对数组进行排序并保持索引关系 2.从控制台取数据怎么取? trim(fgets(STDIN)) 3.多组测试 ...

  6. 百度消息推送REST API探究

    一.百度云推送介绍 云推送(Push)是百度开放云向开发者提供的消息推送服务:通过利用云端与客户端之间建立稳定.可靠的长连接来为开发者提供向客户端应用推送实时消息服务. 百度云推送服务支持推送三种类型 ...

  7. UE4.5.0的Kinect插件(Plugin)<一>

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43193431 UE4 Plugin,在UE4的官网,放出了有个 ...

  8. 【BZOJ 1007】 [HNOI2008]水平可见直线

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 [题意] [题解] 这个人讲得很好 http://blog.csdn.net/o ...

  9. 【p093】细胞分裂

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...

  10. Cocos2d-x 脚本语言Lua基本语法

    Cocos2d-x 脚本语言Lua基本语法 前面一篇博客对Lua这门小巧的语言进行了简单的介绍.本篇博客来给大家略微讲一下Lua的语法.不会长篇累牍得把Lua的全部语法都讲一遍,这里通过下面几点来讲L ...