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

博文

Visual Basic与图像处理24

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

Visual Basic与图像处理(三)

9Laplacian微分算子

前面讲的几种都是一阶微分算子,本节开始讲的是二阶微分算子,从理论上来说二阶微分算子比一阶微分算子更为敏感,因此能够提取到更多的细节信息。二阶微分算子中最常用也最简单的就是拉普拉斯(Laplacian)微分算子,可以用下面的公式进行表示:

 

上式也可以写成平时常见的模板形式:

 

本例的运行界面如下:

Laplacian滤波按钮对应的代码如下:

Private Sub cmdLaplacianFilter_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 Dx As Integer, Dy As Integer

    Dim NGrayValue As Integer

   

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

    DestImHeight = SourceImHeight - 2 '边界像素直接不要了

    DestImWidth = SourceImWidth - 2

   

    '设置目标PictureBox的大小

    PicDest.Height = DestImHeight

    PicDest.Width = DestImWidth

   

 

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

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

   

    '图像的Laplacian滤波

   

   

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

                   

                Next y

            Next x

           

            NGrayValue = Abs(4 * Temp(1, 1) - Temp(0, 1) - Temp(1, 0) - Temp(1, 2) - Temp(2, 1))

            If NGrayValue > 255 Then NGrayValue = 255

            dbits(i - 1, j - 1, 0) = NGrayValue

            dbits(i - 1, j - 1, 1) = NGrayValue

            dbits(i - 1, j - 1, 2) = NGrayValue

        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-622508.html

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

0

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

数据加载中...
扫一扫,分享此博文

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

GMT+8, 2024-4-30 21:41

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部