|||
Visual Basic与图像处理(三)
从本节开始介绍图像增强的知识,在图像的传送和转换,比如复制、扫描等过程中总要造成图像品质的下降,因此需要提供一定的方法对这些降质的图像进行改善处理。常用的一种方法就是将图像中感兴趣的特征进行选择性的突出,减弱次要信息,当然这种方法虽然能提高图像的可读性,但是改善后的图像不一定逼近原始图像,比如突出目标的轮廓、衰减图像的各种噪声,通常把这类方法称为图像增强技术。当然还有一类方法也能改善图像的质量,称为图像复原,这里先不进行阐述。
图像增强的方法通常可分为两大类,第一类就是在空间域内对图像的像素点灰度值直接进行处理,比如区域内进行均值、中值滤波;第二类方法是在频域内进行滤波,即将图像变换到频域,在频域内对图像进行某种运算增强,再变换回空间域,这部分内容在以后也会讲述到。本章讲述的是第一类方法。
1、 均值滤波
均值滤波是图像增强中最简单的一类,主要是为了减少图像中的噪声信号,常见的有3×3,5×5均值滤波,高斯模板滤波等,首先从最简单的3×3均值滤波开始讲起。
所谓3×3均值滤波就是将原图像中每个人像素点的灰度值与其八邻域的八个像素点的灰度值累加,将求得的平均值作为新图像中该像素点的均值,可以用下面的简单模板表示这种滤波方法:
均值滤波中要考虑的是边界像素的处理,最简单的一种处理方法是边界像素不作相应的处理,当然也有其他的处理方法,比如在图像周围补充一些像素,本例中采用边界像素直接复制的方法,系统的运行界面如下:
3×3均值滤波按钮对应的代码如下:
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 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
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
NGrayValue = NGrayValue + Temp(x, y)
Next y
Next x
dbits(i, j, 0) = NGrayValue / 9
dbits(i, j, 1) = NGrayValue / 9
dbits(i, j, 2) = NGrayValue / 9
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均值滤波方法与此类似,只是将模板扩大,改变其中的几句话即可,代码如下:
Private Sub cmd55MeanFilter_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
NGrayValue = NGrayValue + Temp(x, y)
Next y
Next x
dbits(i, j, 0) = NGrayValue / 25
dbits(i, j, 1) = NGrayValue / 25
dbits(i, j, 2) = NGrayValue / 25
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
对应的软件运行界面如下:
从上述两个图可以看出,无论是3×3均值滤波,还是5×5均值滤波,都在一定程度上使得图像变得模糊,也就是说在滤除噪声信号的同时,也损失了图像的部分细节信号。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-19 01:39
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社