prrsw的个人博客分享 http://blog.sciencenet.cn/u/prrsw

博文

Visual Basic与图像处理19

已有 3576 次阅读 2012-10-12 14:47 |系统分类:教学心得| Visual, Basic与图像处理

Visual Basic与图像处理()

4、中值滤波

前面讲的均值滤波器等都是属于线性滤波器,容易带来图像细节的模糊,本节要讲的是一种非线性滤波器:中值滤波。中值滤波最早是有J. W. Jukey1971年提出的一种一维信号处理技术,后来被拓展应用到二维图像处理技术之中。

所谓中值滤波,就是采用一个含有奇数个点的滑动窗口,将当前点灰度值(一般指窗口的中心点)用窗口中各点灰度值的中值来替代。由于一般采用的是奇数窗口,因此只要将各个像素点的灰度等级进行大小排序,中间的竖直就是中值;如果窗口是偶数(特殊情况)。就用排序后中间两个元素的均值来表示中值。

用前面均值滤波直接用线性方程来计算新的灰度值不一样的是,中值滤波首先要对当前窗口内的所有像素点的灰度值进行排序,一般有选择排序和冒泡排序两种方法,具体可参照相关的Visual Basic基础教程中的讲解,这里就不详细解释了。

中值滤波器窗口的形状有多种,有一维也有二维的,对于二维情况,中值滤波器的窗口形状和尺度对滤波结果影响也很大,因此需要根据实际的要求来选择滤波器的形状和尺寸。本例中示范一种最简单的3×3中值滤波,其余的情况读者可根据本例提供的相关代码适当修改得到,本例的运行界面如下:

3×3中值滤波按钮对应的代码如下:

Private Sub cmd33MedianFilter_Click()

    Dim i As Integer, j As Integer

    Dim PixelValue As Long

    Dim r As Integer, g As Integer, b As Integer

    Dim GrayValue As Integer

    Dim x As Integer, y As Integer

    

    Dim Temp(8) As Integer, TV As Integer

  

    Dim NGrayValue As Integer

   

     '设置目标图像的高度和宽度

    DestImHeight = SourceImHeight

    DestImWidth = SourceImWidth

   

    '设置目标PictureBox的大小

    PicDest.Height = DestImHeight

    PicDest.Width = DestImWidth

   

 

    ReDim dbits(DestImHeight - 1, DestImWidth - 1, 2) As Byte '重新定义目标数组的维数

    dbits = sbits '数组的直接复制,只有数组维数完全一样才可以

   

    '图像的中值滤波

   

    For i = 1 To SourceImHeight - 2 '边界像素不处理

        For j = 1 To SourceImWidth - 2

            NGrayValue = 0

            For x = 0 To 2

                For y = 0 To 2

               

                    r = sbits(i + 1 - x, j + 1 - y, 0)

                    g = sbits(i + 1 - x, j + 1 - y, 1)

                    b = sbits(i + 1 - x, j + 1 - y, 2)

              '插入图像处理的过程,对r, g, b进行处理

                    Temp(x * 3 + y) = 0.3 * r + 0.59 * g + 0.11 * b

                Next y

            Next x

            '选择排序

            For x = 0 To 7

                For y = x + 1 To 8

                    If Temp(x) > Temp(y) Then

                        TV = Temp(x)

                        Temp(x) = Temp(y)

                        Temp(y) = TV

                    End If

                Next y

            Next x

               

           

            dbits(i, j, 0) = Temp(4)

            dbits(i, j, 1) = Temp(4)

            dbits(i, j, 2) = Temp(4)

        Next j

    Next i

   

       

   

    Dim tDBmpInfo As BITMAP

    Dim hDestBmp As Long

       

 

    hDestBmp = PicDest.Image.Handle

 

        '获得位图信息

    Call GetObject(hDestBmp, Len(tDBmpInfo), tDBmpInfo)

    ReDim ImageArray(1 To DestImWidth * 4, 1 To DestImHeight) As Byte

     

   

    For i = 1 To DestImHeight

        For j = 1 To DestImWidth

            ImageArray((j - 1) * 4 + 1, i) = dbits(i - 1, j - 1, 2)

            ImageArray((j - 1) * 4 + 2, i) = dbits(i - 1, j - 1, 1)

            ImageArray((j - 1) * 4 + 3, i) = dbits(i - 1, j - 1, 0)

        Next j

    Next i

   

'获得源图与目标图二进制位

 

Call SetBitmapBits(hDestBmp, tDBmpInfo.bmWidthBytes * tDBmpInfo.bmHeight, ImageArray(1, 1))

 

End Sub



https://blog.sciencenet.cn/blog-648901-621839.html

上一篇:Visual Basic与图像处理18
下一篇:Visual Basic与图像处理20
收藏 IP: 221.130.58.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-30 20:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部