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

博文

Visual Basic与图像处理17

已有 2912 次阅读 2012-10-12 08:17 |系统分类:教学心得|关键词:学者| Visual, Basic与图像处理

Visual Basic与图像处理()

2、高斯滤波

高斯滤波与均值滤波方法接近,只是采用的模板不一样,均值滤波的模板中每个像素点权重是相等,而高斯滤波认为当前像素点的权重最大,距离越远的像素点在滤波结果中所占的权重越小,最常见的3×3高斯滤波器模板如下:

之所以称为高斯滤波,是因为上述模板是采样二维高斯函数得到的,下图就是3×3高斯滤波的运行界面:

3×3高斯滤波按钮对应的代码如下:

Private Sub cmd33GaussianFilter_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 Temp(2, 2) As Integer

    Dim x As Integer, y 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

          

            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, y) = 0.3 * r + 0.59 * g + 0.11 * b

                Next y

            Next x

            NGrayValue = Temp(0, 0) + Temp(0, 1) * 2 + Temp(0, 2) + Temp(1, 0) * 2 + Temp(1, 1) * 4 + Temp(1, 2) * 2 + Temp(2, 0) + Temp(2, 1) * 2 + Temp(2, 2)

            dbits(i, j, 0) = NGrayValue / 16

            dbits(i, j, 1) = NGrayValue / 16

            dbits(i, j, 2) = NGrayValue / 16

        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

 

5×5高斯滤波器模板如下:

其滤波方法与前面介绍的方法一致,该部分运行界面如下:

5×5高斯滤波按钮对应的代码如下:

Private Sub cmd55GaussianFilter_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 Temp(4, 4) As Integer

    Dim x As Integer, y 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 = 2 To SourceImHeight - 3 '边界像素不处理

        For j = 2 To SourceImWidth - 3

            NGrayValue = 0

            For x = 0 To 4

                For y = 0 To 4

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

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

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

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

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

                Next y

            Next x

            NGrayValue = Temp(0, 0) + Temp(0, 1) * 2 + Temp(0, 2) * 4 + Temp(0, 3) * 2 + Temp(0, 4) '第一行

            NGrayValue = NGrayValue + Temp(1, 0) * 2 + Temp(1, 1) * 4 + Temp(1, 2) * 8 + Temp(1, 3) * 4 + Temp(1, 4) * 2 '第二行

            NGrayValue = NGrayValue + Temp(2, 0) * 4 + Temp(2, 1) * 8 + Temp(2, 2) * 16 + Temp(2, 3) * 8 + Temp(2, 4) * 4 '第三行

            NGrayValue = NGrayValue + Temp(3, 0) * 2 + Temp(3, 1) * 4 + Temp(3, 2) * 8 + Temp(3, 3) * 4 + Temp(3, 4) * 2 '第四行

            NGrayValue = NGrayValue + Temp(4, 0) + Temp(4, 1) * 2 + Temp(4, 2) * 4 + Temp(4, 3) * 2 + Temp(4, 4) '第五行

         

            dbits(i, j, 0) = NGrayValue / 100

            dbits(i, j, 1) = NGrayValue / 100

            dbits(i, j, 2) = NGrayValue / 100

        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://m.sciencenet.cn/blog-648901-621699.html

上一篇:Visual Basic与图像处理16
下一篇:Visual Basic与图像处理18

0

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

数据加载中...

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

GMT+8, 2024-5-25 04:25

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部