|||
Visual Basic与图像处理(二)
9、直方图均衡化
直方图均衡化也成为灰度均衡,是点运算较为复杂的一种,其基本原理是对图像中像素个数较多的灰度区域进行范围拓宽,而对像素较少的灰度区域,即在图像画面中不起主要作用的灰度值进行归并。一般在图像比较或者分割之前进行直方图均衡,可以使图像具有较为一致格式。比如由于光照条件使得同一背景图像有较大的亮度反差就可以利用直方图均衡化进行亮度调整。
设f(i, j), g(i, j)分别为原图像和处理后的图像,图像的灰度等级变换范围为[0, 255],直方图均衡化可以按照以下的步骤进行:
(1) 原图像直方图统计结果为Hist[255];
(2) 求原图像直方图的灰度分布概率,记作p[255];
(3) 计算元图像各个灰度等级的累计分布概率,记作PA[255],显然PA[0]=0, PA[255]=1;
(4) 进行直方图均衡化新的灰度值计算,将新的灰度值存放于映射Map[255]中,其中:
Map[i]=255×PA[i]。
从上述步骤来看,要做直方图均衡化,首先要计算直方图统计结果,然后再得到每个灰度等级对应的新的灰度等级,最后才能完成直方图均衡化操作。程序的实现与前面的类似,这里不在详细讲述,该例的运行界面如下图所示:
直方图均衡化按钮对应的代码如下:
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
ThresholdValue = Val(txtThreshold)
'设置目标图像的高度和宽度
DestImHeight = SourceImHeight
DestImWidth = SourceImWidth
'设置目标PictureBox的大小
PicDest.Height = DestImHeight
PicDest.Width = DestImWidth
'图像的直方图统计
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
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
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
NGrayValue = Map(GrayValue)
PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue)
Next j
Next i
End Sub
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-19 00:56
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社