【基本算法】中值滤波器
93°2009/08/16软件综合 IP:广东
太懒了不好,这里放上我验证概念时写的低效率的程序,仅仅是看算法结构,这里用的是3x3的结构元素。

运行效果:简单的滤波还是很不错的。

v1.jpg   

v1_2.png



Public Sub ClearNoise(ByVal dgGrayValue As Integer)
    Dim p As Byte() = New Byte(9  - 1) {}
    Dim y As Integer
    For y = 1 To (XXXXXpobj.Height - 1) - 1
        Dim x As Integer
        For x = 1 To (XXXXXpobj.Width - 1) - 1
            p(0) = XXXXXXXXXXXXtPixel((x - 1), (y - 1)).R
            p(1) = XXXXXXXXXXXXtPixel(x, (y - 1)).R
            p(2) = XXXXXXXXXXXXtPixel((x + 1), (y - 1)).R
            p(3) = XXXXXXXXXXXXtPixel((x - 1), y).R
            p(4) = XXXXXXXXXXXXtPixel(x, y).R
            p(5) = XXXXXXXXXXXXtPixel((x + 1), y).R
            p(6) = XXXXXXXXXXXXtPixel((x - 1), (y + 1)).R
            p(7) = XXXXXXXXXXXXtPixel(x, (y + 1)).R
            p(8) = XXXXXXXXXXXXtPixel((x + 1), (y + 1)).R
            Dim j As Integer
            For j = 0 To 5 - 1
                Dim i As Integer
                For i = (j + 1) To 9 - 1
                    If (p(j) > p(i)) Then
                        Dim s As Byte = p(j)
                        p(j) = p(i)
                        p(i) = s
                    End If
                Next i
            Next j
            XXXXXXXXXXXXtPixel(x, y, XXXXXXXXomArgb(p(4), p(4), p(4)))
        Next x
    Next y
End Sub




【以下是转载】

  中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值.
  实现方法:
  1:通过从图像中的某个采样窗口取出奇数个数据进行排序
  2:用排序后的中值取代要处理的数据即可
  中值滤波法对消除椒盐噪音非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大.
  中值滤波在图像处理中,常用于用来保护边缘信息,是经典的平滑噪声的方法
  中值滤波原理
  中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个拎域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
+1000  科创币    novakon    2009/08/16 浅显
来自:计算机科学 / 软件综合
6
 
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
93° 作者
15年5个月前 IP:未同步
141481
c++实现代码



public: void __gc* ClearNoise(Int32 __gc* dgGrayValue)
{
    Byte __gc* buffer __gc [] = __gc new Byte __gc*[9];
    for (Int32 __gc* i = 1; (i < (this->bmpobj->Height - 1)); i++)
    {
        for (Int32 __gc* j = 1; (j < (this->bmpobj->Width - 1)); j++)
        {
            buffer[0] = this->bmpobj->GetPixel((j - 1), (i - 1))->R;
            buffer[1] = this->bmpobj->GetPixel(j, (i - 1))->R;
            buffer[2] = this->bmpobj->GetPixel((j + 1), (i - 1))->R;
            buffer[3] = this->bmpobj->GetPixel((j - 1), i)->R;
            buffer[4] = this->bmpobj->GetPixel(j, i)->R;
            buffer[5] = this->bmpobj->GetPixel((j + 1), i)->R;
            buffer[6] = this->bmpobj->GetPixel((j - 1), (i + 1))->R;
            buffer[7] = this->bmpobj->GetPixel(j, (i + 1))->R;
            buffer[8] = this->bmpobj->GetPixel((j + 1), (i + 1))->R;
            for (Int32 __gc* k = 0; (k < 5); k++)
            {
                for (Int32 __gc* m = (k + 1); (m < 9); m++)
                {
                    if (buffer[k] > buffer[m])
                    {
                        Byte __gc* num3 = buffer[k];
                        buffer[k] = buffer[m];
                        buffer[m] = num3;
                    }
                }
            }
            this->bmpobj->SetPixel(j, i, Color::FromArgb(buffer[4], buffer[4], buffer[4]));
        }
    }
}


引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
15年5个月前 IP:未同步
141550
也就是说,在取样的周围n个点中如果噪点只有一两个,那么中位数必定是除了噪点之外的旁边像素的近似平均值。这样就把多出的噪点忽视掉了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
我说要有光
15年5个月前 IP:未同步
141577
[quote]引用第1楼破93于2009-08-16 23:47发表的  :
c++实现代码


[size=3]
[code]public: void __gc* ClearNoise(Int32 __gc* dgGrayValue)
.......[/quote]
this的详细数据放出来啊 = =
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
rc5
15年5个月前 IP:未同步
141598
每次看到 p(0) = XXXXXXXXXXXXtPixel((x - 1), (y - 1)).R
            p(1) = XXXXXXXXXXXXtPixel(x, (y - 1)).R
            p(2) = XXXXXXXXXXXXtPixel((x + 1), (y - 1)).R
            p(3) = XXXXXXXXXXXXtPixel((x - 1), y).R
            p(4) = XXXXXXXXXXXXtPixel(x, y).R
            p(5) = XXXXXXXXXXXXtPixel((x + 1), y).R
            p(6) = XXXXXXXXXXXXtPixel((x - 1), (y + 1)).R
            p(7) = XXXXXXXXXXXXtPixel(x, (y + 1)).R
            p(8) = XXXXXXXXXXXXtPixel((x + 1), (y + 1)).R
这样一堆的时候大家是否想过:怎么样能把这种源码再重构简化一些?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
darkstorm
15年5个月前 IP:未同步
142101
CUDA里读进高速片内存储器,多线程共享一块数据,可以减少存储器访问
LZ的这一段代码如果编译器不够牛,会造成九倍的片外存储器访问
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
93°
学者 笔友
文章
651
回复
6032
学术分
30
2007/04/10注册,6年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}