|||
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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-25 04:25
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社