【基本算法】中值滤波器
太懒了不好,这里放上我验证概念时写的低效率的程序,仅仅是看算法结构,这里用的是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 (Me.bmpobj.Height - 1) - 1
        Dim x As Integer
        For x = 1 To (Me.bmpobj.Width - 1) - 1
            p(0) = Me.bmpobj.GetPixel((x - 1), (y - 1)).R
            p(1) = Me.bmpobj.GetPixel(x, (y - 1)).R
            p(2) = Me.bmpobj.GetPixel((x + 1), (y - 1)).R
            p(3) = Me.bmpobj.GetPixel((x - 1), y).R
            p(4) = Me.bmpobj.GetPixel(x, y).R
            p(5) = Me.bmpobj.GetPixel((x + 1), y).R
            p(6) = Me.bmpobj.GetPixel((x - 1), (y + 1)).R
            p(7) = Me.bmpobj.GetPixel(x, (y + 1)).R
            p(8) = Me.bmpobj.GetPixel((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
            Me.bmpobj.SetPixel(x, y, Color.FromArgb(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    浅显
来自 软件综合
 
2009-8-16 23:47:11
93°(作者)
1楼
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]));
        }
    }
}


折叠评论
加载评论中,请稍候...
折叠评论
2009-08-17 11:21:31
2楼
也就是说,在取样的周围n个点中如果噪点只有一两个,那么中位数必定是除了噪点之外的旁边像素的近似平均值。这样就把多出的噪点忽视掉了。
折叠评论
加载评论中,请稍候...
折叠评论
3楼
[quote]引用第1楼破93于2009-08-16 23:47发表的  :
c++实现代码


[size=3]
[code]public: void __gc* ClearNoise(Int32 __gc* dgGrayValue)
.......[/quote]
this的详细数据放出来啊 = =
折叠评论
加载评论中,请稍候...
折叠评论
4楼
每次看到 p(0) = Me.bmpobj.GetPixel((x - 1), (y - 1)).R
            p(1) = Me.bmpobj.GetPixel(x, (y - 1)).R
            p(2) = Me.bmpobj.GetPixel((x + 1), (y - 1)).R
            p(3) = Me.bmpobj.GetPixel((x - 1), y).R
            p(4) = Me.bmpobj.GetPixel(x, y).R
            p(5) = Me.bmpobj.GetPixel((x + 1), y).R
            p(6) = Me.bmpobj.GetPixel((x - 1), (y + 1)).R
            p(7) = Me.bmpobj.GetPixel(x, (y + 1)).R
            p(8) = Me.bmpobj.GetPixel((x + 1), (y + 1)).R
这样一堆的时候大家是否想过:怎么样能把这种源码再重构简化一些?
折叠评论
加载评论中,请稍候...
折叠评论
2009-08-19 08:53:08
2009-8-19 08:53:08
5楼
CUDA里读进高速片内存储器,多线程共享一块数据,可以减少存储器访问
LZ的这一段代码如果编译器不够牛,会造成九倍的片外存储器访问
折叠评论
加载评论中,请稍候...
折叠评论

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

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
ID:{{user.uid}}
{{user.username}}
{{user.info.certsName}}
{{user.description}}
{{format("YYYY/MM/DD", user.toc)}}注册,{{fromNow(user.tlv)}}活动
{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png