原文: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. Linux网络编程——原始套接字实例:MAC 头部报文分析

    通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...

  2. 基于 Android NDK 的学习之旅-----环境搭建

    工欲善其事 必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的 ...

  3. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针

    一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...

  4. C++ public、protected、private 继承方式的区别

    访问修饰符 public.protected.private,无论是修饰类内成员(变量.函数),还是修饰继承方式,本质上实现的都是可见性的控制. Difference between private, ...

  5. 版本控制— SVN & git

    版本控制—— SVN & GIT 提问 什么是版本控制? 是能够一直监视代码文件的变更,并存储这些文件以便将来引用的一种机制(软件) 为什么要使用版本控制? (1)记录哪个开发人员做了变更 ( ...

  6. 【CTO俱乐部研修班开课】看板先驱David J. Anderson:看板核心在于创造一种能力——提升敏捷性

    看板开发方法是近年来最热门的敏捷和精益开发方法.看板之父David J. Anderson觉得其核心在于帮助企业创造一种能力--提升敏捷性.CTO俱乐部看板研修班将通过理论.沙盘模拟.真实案例分享等阐 ...

  7. Struts2——(7)拦截器组件

    AOP:面向切面编程(通过配置文件来指定作用到目标对象) OOP:面向对象编程 AOP具有很好的可插拔特性,很灵活. 可用于封装共通的业务处理,之后可以通过配置作用到Action组件上. 共通的业务处 ...

  8. 修改MessageBox的标题的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1.用Win API的::MessageBox或CWnd::MessageBox代替AfxMessageBox. 2. ...

  9. wpf mvvm datagrid数据过滤

    原文:wpf mvvm datagrid数据过滤 datagrid数据过滤,你可以通过设置RowStyle属性,通过将Visibility绑定到ViewModel层的属性来控制是否可见,比如:   & ...

  10. [ACM] POJ 2689 Prime Distance (筛选范围大素数)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12811   Accepted: 3420 D ...