||
Visual Basic与图像处理(三)
图像的锐化处理也是图像增强的一种方法,主要是为了突出图像中的部分细节或者增强被模糊了细节。从取样规律来说,在图像分辨率不足时,所获得的像素点可以认为是周围景物亮度的平均值,这种均值效率使得图像变得模糊,可以认为这种均值处理的方法与积分效应类似,与此相对,为了强化图像细节,可以对图像进行微分处理,后面介绍的锐化处理就可以看成为各种不同的微分算法。
从数学定义来看,微分的含义就是数据的变化率,由于图像是由离散的像素点表示的,因此图像的微分就是像素点的差值,称为差分。为了便于叙述,后文在不再区分微分和差分的概念。
5、具有方向性的一阶微分算子
为了便于理解,首先从一些最简单的微分算子将其,这类一阶微分算法的最大特点就是可以获得图像中特定方向上的灰度变化情况,在特定的纹理分析、检测方法非常有效,有时会称为方向性锐化。
(1) 水平方向的微分算子
水平方向的微分算子就是为了获得图像在水平方向上的灰度变化率,对于像素点f(x,y),水平算子的定义如下:
用前面讲述过的模板的概念,水平方向微分算法可以用下面的模板进行表示:
在实际运算中,可以对上述的计算结果取绝对值处理,以避免出现负值,本例的运行界面如下:
水平微分算子按钮对应代码如下:
Private Sub cmdHonSharpFilter_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 - 2 '边界像素直接不要了
DestImWidth = SourceImWidth - 2
'设置目标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
Next y
Next x
NGrayValue = Abs(Temp(0, 0) + 2 * Temp(0, 1) + Temp(0, 2) - Temp(2, 0) - 2 * Temp(2, 1) - Temp(2, 2))
If NGrayValue > 255 Then NGrayValue = 255
dbits(i - 1, j - 1, 0) = NGrayValue
dbits(i - 1, j - 1, 1) = NGrayValue
dbits(i - 1, j - 1, 2) = NGrayValue
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
垂直方向滤波的方法与水平方向锐化滤波的方法基本一致,只是将模板修改如下:
垂直方向滤波的界面如下:
垂直锐化滤波按钮对应的代码如下:
Private Sub cmdVSharpFilter_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 - 2 '边界像素直接不要了
DestImWidth = SourceImWidth - 2
'设置目标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
Next y
Next x
NGrayValue = Abs(Temp(0, 0) + 2 * Temp(1, 0) + Temp(2, 0) - Temp(0, 2) - 2 * Temp(1, 2) - Temp(2, 2))
If NGrayValue > 255 Then NGrayValue = 255
dbits(i - 1, j - 1, 0) = NGrayValue
dbits(i - 1, j - 1, 1) = NGrayValue
dbits(i - 1, j - 1, 2) = NGrayValue
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:54
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社