||
Visual Basic与图像处理(三)
4、中值滤波
前面讲的均值滤波器等都是属于线性滤波器,容易带来图像细节的模糊,本节要讲的是一种非线性滤波器:中值滤波。中值滤波最早是有J. W. Jukey在1971年提出的一种一维信号处理技术,后来被拓展应用到二维图像处理技术之中。
所谓中值滤波,就是采用一个含有奇数个点的滑动窗口,将当前点灰度值(一般指窗口的中心点)用窗口中各点灰度值的中值来替代。由于一般采用的是奇数窗口,因此只要将各个像素点的灰度等级进行大小排序,中间的竖直就是中值;如果窗口是偶数(特殊情况)。就用排序后中间两个元素的均值来表示中值。
用前面均值滤波直接用线性方程来计算新的灰度值不一样的是,中值滤波首先要对当前窗口内的所有像素点的灰度值进行排序,一般有选择排序和冒泡排序两种方法,具体可参照相关的Visual Basic基础教程中的讲解,这里就不详细解释了。
中值滤波器窗口的形状有多种,有一维也有二维的,对于二维情况,中值滤波器的窗口形状和尺度对滤波结果影响也很大,因此需要根据实际的要求来选择滤波器的形状和尺寸。本例中示范一种最简单的3×3中值滤波,其余的情况读者可根据本例提供的相关代码适当修改得到,本例的运行界面如下:
3×3中值滤波按钮对应的代码如下:
Private Sub cmd33MedianFilter_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 x As Integer, y As Integer
Dim Temp(8) As Integer, TV 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 * 3 + y) = 0.3 * r + 0.59 * g + 0.11 * b
Next y
Next x
'选择排序
For x = 0 To 7
For y = x + 1 To 8
If Temp(x) > Temp(y) Then
TV = Temp(x)
Temp(x) = Temp(y)
Temp(y) = TV
End If
Next y
Next x
dbits(i, j, 0) = Temp(4)
dbits(i, j, 1) = Temp(4)
dbits(i, j, 2) = Temp(4)
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-4-30 20:05
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社