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

博文

Visual Basic与图像处理6

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

Visual Basic与图像处理()

3、灰度直方图

灰度直方图是描述图像中像素灰度分布的一个统计图,简而言之就是描述图像中每个灰度值像素的个数或者概率,横坐标对应就是图像的灰度级别,纵坐标是该灰度级别对应的像素个数(或概率)。要得到图像的灰度直方图,首先要完成各灰度级别对应像素个数的统计,将统计结果存放于Hist[255]数组中,然后再根据这个数组进行直方图的绘制。

基于前面的编程基础,相信要完成直方图统计应该都没有问题,这里要简要介绍一下直方图绘制的方法。前文提及过,PictureBox不仅支持图像的读写,还支持图形的绘制,在这里为简便起见,只用一系列直线进行直方图的绘制,PictureBoxLine方法可用于直线的绘制,其原型如下:

object.Line  [Step] (x1, y1) - [Step] (x2, y2), [color], [B][F]

这里(x1,y1)为直线的起点,(x2,y2)为直线的终点,如果没有Step表示直接从起点画到终点,如果有关键字Step,表示分别沿着x1y1在横向和纵向绘制x2, y2的长度,color用于设置直线的颜色,可用RGB函数进行设定。如果使用了 B 选项,则 F 选项规定矩形以矩形边框的颜色填充。不能不用 B 而用 F。如果不用 F 光用 B,则矩形用当前的 FillColor FillStyle 填充,FillStyle的缺省值是Transparent,由于本例中只画直线,因此B选项和F选项都不选用。

在直方图绘制时,首先要确定每个灰度等级对应的线段长度,这里采用常见的一种方法,即首先找出统计概率最高的灰度等级,设定其绘制长度,其余灰度等级绘制的线段长度与该灰度等级成对比,假设概率最高的灰度等级对应的绘制长度为L,其他灰度等级的线段绘制长度可按照下面的方式进行计算:

Lgray[i]=L*Hist[i]/Histmax

首先对程序界面进行设计,本例主要由两个PictureBox组成,其中一个PictureBox用于存放图像,另一个用于直方图的绘制。用于直方图绘制的PictureBox宽度直接设置为256个像素,即每个灰度等级绘制的直线占的宽度都是1个像素。该程序的软件运行界面如下:

直方图绘制按钮对应的代码如下:

Private Sub cmdHist_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(0 To 255) As Long

    Dim maxHist As Long, L As Integer, L0 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

               Hist(GrayValue) = Hist(GrayValue) + 1

        Next j

    Next i

   

  '直方图绘制

   

   '第一步,寻找Hist数组中的最大值,即灰度等级统计概率最高者

    maxHist = Hist(0)

    For i = 1 To 255

        If maxHist < Hist(i) Then maxHist = Hist(i)

    Next i

       

    '绘制直方图,其中最高概率的灰度等级绘制长度与PictureBox的高度一致

    L = PicHist.Height

    For i = 0 To 255

        L0 = L * Hist(i) / maxHist

        PicHist.Line (i, L - 1)-Step(0, -L0), RGB(0, 0, 255) '绘制蓝色线条

    Next i

       

End Sub



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

上一篇:Visual Basic与图像处理5
下一篇:Visual Basic与图像处理7

1 张学文

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

数据加载中...

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

GMT+8, 2024-5-5 22:30

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部