VB图像处理之几个常用滤镜的实现

VB图像处理之几个常用滤镜的实现,第1张

VB图像处理之几个常用滤镜的实现,第2张

前面提到了二次线性插值的应用。这篇文章将告诉你锐化,柔化,扩散和雕刻滤镜的实现。

首先,锐化

锐化算法很简单,就是比较几个相邻像素,加上当前像素和周围像素的差值。这里有一个例子:

英国石油公司英国石油公司英国石油公司

假设有一张图片,4*4,16个像素,分别用A-L表示,我们先来看这张图片。只有中间的四个像素F、G、J、K的“邻居”才是完整的。

为了简单起见,我们只对这四个像素进行处理,因为在实际画面中,由于画面的大小是由很多像素组成的,所以如果周围的像素不进行处理,并不会影响最终的效果。

首先计算差值:

delta = F-(A+B+C+E+G+I+J+K)/8
(A+B+C+E+G+I+J+K)/8是F周围像素的平均值,

将这个平均值乘以一个系数,再加上F,就得到一个新的F值:

F = F+δ*α

这个系数α就是锐化的程度。改变这个系数可以得到不同的锐化效果。不过一般都比较小,比如0.3。

所以我们只需要用两个周期遍历整张图片的像素值(去除边界)就可以得到一个锐化的效果。

但是,你可能会发现,在处理后面的点时,前面的点的值已经不是原来的值了。比如在处理G的时候,需要用到F的值,F的值已经被改变了,而F的改变和G的值有关,所以会变成循环引用。为了避免整个问题,这里有一个改进的方法:

英国石油公司英国石油公司英国石油公司

让我们从A点开始,将差值计算方法改为:

Delta = A-(b+ E+F)/3
F = F+Delta * Alpha

按照从左到右和从上到下的顺序扫描所有像素。此时,在计算中不会遇到已经处理过的像素,整个处理过程会因为参与计算的像素数量减少而加快。

根据我们在“VB图像处理中像素的采集与输出”中得到的像素数组。我们可以这样写:

Public Sub Sharp(可选ByVal SharpDgree As Single = 0.3)
Dim X As Long
Dim Y As Long
Dim Ix As Long
Dim Diff As Long
Dim Diff 1 As Long
Dim div 1 As Single
Dim div 2 As Single
Dim Max As Long
On Error line

max = 255
Done = False
time filter = time gettime
TemplateSize = 1
Sensitivity = Sensitivity * 9
div 1 = 1+SharpDgree
div 2 =-SharpDgree/3
For X = 0 To output wid-1
For Y = 0 To output hei-1
RR = ColOut(0,X,Y) * Div1
GG Y)* div 1
Ix = X+1
Iy = Y+1
R = coloout(0,Ix,Iy)
R = R+coloout(0,X,Iy)+coloout(0,Ix,Y)
G = coloout(1,Ix,Iy)
G = G+coloout(1,X,Iy)+coloout(1,Ix,Y)
B = coloout(2,Ix y)
R = R * div 2
G = G * div 2
B = B * div 2
RR = RR+R
GG = GG+G
BB = BB+B
If RR < 0则RR = 0
If RR > Max则RR = Max
If GG < 0则GG = 0
If GG > Max则GG = Max
If BB < 0 Then BB = 0
If BB > Max Then BB = Max
coloout(0,X,Y)= RR
coloout(1,X,Y)= GG
coloout(2,X,Y) = BB
Next
Next

Done = True
time filter = time gettime-time filter
Exit Sub
ErrLine:
Done = True
MsgBox Err。描述
结束Sub

因为在计算新像素的过程中,新值大于255或者小于0,所以必须在计算完成后进行判断。

使用的全局变量:

“Public TimeFilter As Long”用于记录过滤器处理时间
Dim RR As Long”用于保存红色成分
Dim GG As Long]用于保存绿色成分
Dim BB As Long]用于保存蓝色成分。

原图:

锐化效果:

第二,软化

软化算法和锐化类似,但效果正好相反,就是用周围几个点的平均值代替当前点。

英国石油公司英国石油公司英国石油公司

计算方法:

F =(A+B+C+E+F+G+I+J+K)/9
G =(B+C+D+F+G+H+J+K+L)/9
...
...

具体的程序,我这里就不多言了,只要你把上面的程序稍微改一下就可以了。

原图:

软化效果:

三。增殖

产生类似水彩画的效果。

算法很简单,就是用周围的随机点代替当前点。

英国石油公司英国石油公司英国石油公司

点f可以用它周围的A,B,C,E,G,I,J,K中的任意一个来代替。
g点可以用它周围的B,C,D,F,H,J,K,L中的任意一个来代替。
J点可以用它周围的E,F,G,I,K,M,N,O中的任意一个来代替。
K点可以用它周围的F,G,H,J,L,N,O,P中的任意一个来代替。

至于选哪个点,可以用随机数来选。

原图:

扩散效应:

四。雕刻

减去两个相邻像素,并将差值加上127作为新值。

英国石油公司英国石油公司英国石油公司

如果我们从左到右“雕刻”

A = B-A+127
B = C-B+127
C = D-C+127
...

如果我们从上到下“雕刻”

A = E-A+127
B = F-B+127
C = G-C+127
...

当然,我们可以从更多的方向“雕刻”,如:左下、右上、左上、右下...以此类推,共有8个可选方向。

另外127是“雕刻”效果后的亮度。我们可以在过程中写雕刻方向和亮度作为参数。

Public Sub Emboss(可选EmbossDirection为整数,可选Lighteness为整数)
...

原图:

软化效果:

这些滤波器的算法都比较简单,很容易用VB实现。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VB图像处理之几个常用滤镜的实现

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情