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

博文

Visual Basic与图像处理14

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

Visual Basic与图像处理(三)

Visual Basic做图像处理其实一直未专业人员所不屑,很大原因在于其速度不快,甚至很多初步接触图像处理的学生也是提到就皱眉,其实Visual Basic做图像处理理论研究并不是那么一无是处,尤其对于初学者,毕竟容易上手,能够快速的进行研究,还是有很多优点的,这里就不再辩论这个问题。

前文已经讲述了点运算的知识,也结合了一些实例来阐述Visual Basic进行图像处理的方法,从本节开始逐步进入稍微复杂的问题,但首先要解决的就是常说的处理速度的问题。本节还是从直方图均衡化那个实例下手,从实例分析来逐步提高运行速度。

引起Visual Basic图像处理速度慢的很大原因是前面说的非常多的两个函数PointPSet方法,一个是从控件中取颜色点,一个是往控件界面上设置颜色点,无论取点还是设置点,都是要调用显存的,这显然会降低速度。在前面的直方图均衡化程序中,在灰度统计的时候遍历了一次图像,挨个取颜色点的值,而在后面设置颜色点,得到目标图像的时候,又得遍历一次图像,我们能想到的第一个办法就是尽量减少使用PointPSet的次数。前面提到过,图像的本质就是一个矩阵,而矩阵在程序设计中往往是用数组进行表示的,如果在第一次取点以后就把得到的数据放置于数组中,那么后文再次调用这些数据时,就可以直接调用这个数组,可以有效的提高程序运行速度。

本例基于上述思路,采用数组来存储图像数据,由于在程序运行前,图像数据大小还不知道,因此需要采用动态数组来实现数据的存储,运行界面与前面的一样,如下图所示:

首先在窗口模块中定位了两个窗口级别的动态数组SourceImData()DestImData(),在得到图像的高度和宽度以后就可以定义数组的大小,通过数组可以减少使用Point方法的次数,直方图均衡化按钮对应的代码调整如下:

Private Sub cmdGrayEqua_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 Hist(255) As Long '存放原直方图统计结果

    Dim P(255) As Single '存放原直方图概率

    Dim PA(255) As Single '存放原直方图累计分布概率

    Dim Map(255) As Single '存放灰度等级映射结果

       

    Dim NGrayValue As Integer

  

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

    DestImHeight = SourceImHeight

    DestImWidth = SourceImWidth

   

    '设置目标PictureBox的大小

    PicDest.Height = DestImHeight

    PicDest.Width = DestImWidth

   

    ReDim SourceImData(SourceImHeight - 1, SourceImWidth - 1) As Integer

    ReDim DestImData(DestImHeight - 1, DestImWidth - 1) As Integer

   

    '图像的直方图统计

    For i = 0 To SourceImHeight - 1

        For j = 0 To SourceImWidth - 1

               PixelValue = PicSource.Point(j, i)

               r = PixelValue Mod 256

               g = (PixelValue 256) Mod 256

               b = PixelValue 65536

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

               GrayValue = 0.3 * r + 0.59 * g + 0.11 * b

               SourceImData(i, j) = GrayValue

               Hist(GrayValue) = Hist(GrayValue) + 1

              

        Next j

    Next i

   

   

    P(0) = Hist(0) / SourceImHeight / SourceImWidth

    Map(0) = 255 * P(0)

    For i = 1 To 255

        P(i) = P(i - 1) + Hist(i) / SourceImHeight / SourceImWidth

        Map(i) = 255 * P(i)

    Next i

   

    '图像的直方图均衡化

    For i = 0 To SourceImHeight - 1

        For j = 0 To SourceImWidth - 1

               NGrayValue = Map(SourceImData(i, j))

               PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue)

        Next j

    Next i

 

End Sub

如果细心对比,会发现通过这样一个改变,已经能稍微提高该程序的运行速度了,当然还是没有达到理想的要求,后面会继续讨论。



https://m.sciencenet.cn/blog-648901-621447.html

上一篇:Visual Basic与图像处理13
下一篇:Visual Basic与图像处理15

0

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

数据加载中...

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

GMT+8, 2024-5-24 17:57

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部