銳化的算法很簡單,就是比較相鄰的幾個像素,把當前像素加上和周圍的像素的差就可以了。
這裡我給出一個示例:
A B C D
E F G H
I J K L
M N O P
假設有一個圖片,4*4,共16個像素,分別用A--L來代表。
我們先觀察這個圖片,只有中間的F,G,J,K這四個像素的「鄰居」是全的。
但是大家或許會發現在處理後面幾個點的時候,前面的點的值已經不是原來的值了,
比如處理G的時候,需要用到F的值,而F則已經被改變,並且F的改變又和G的值有關係,這樣就會變成一種循環引用。為了避免整個問題,這裡給出一個改良的方法:
A B C D
E F G H
I J K L
M N O P
我們從A點開始做,將差值計算方法改成:
Delta= A - (B+E+F) / 3
F=F + Delta * Alpha
按照從左到右,從上到下的順序來掃瞄所有像素,這時在計算中就不會遇到已經被處理過的像素了,並且因為減少了參與運算的像素,整個處理過程也得以加快。
按照我們在VB圖像處理,(一)像素的獲取和輸出中已經得到的像素數組。我們可以這樣寫:
Public Sub Sharp(Optional ByVal SharpDgree As Single = 0.3)
Dim X As Long
Dim Y As Long
Dim Ix As Long
Dim Iy As Long
Dim Diff As Long
Dim Diff1 As Long
Dim Div1 As Single
Dim Div2 As Single
Dim Max As Long
On Error GoTo ErrLine
Max = 255
Done = False
TimeFilter = timeGetTime
TemplateSize = 1
Sensitivity = Sensitivity * 9
Div1 = 1 + SharpDgree
Div2 = -SharpDgree / 3
For X = 0 To OutPutWid - 1
For Y = 0 To OutPutHei -1
RR = ColOut(0, X, Y) * Div1
GG = ColOut(1, X, Y) * Div1
BB = ColOut(2, X, Y) * Div1
Ix = X + 1
Iy = Y + 1
R = ColOut(0, Ix, Iy)
R = R + ColOut(0, X, Iy) + ColOut(0, Ix, Y)
G = ColOut(1, Ix, Iy)
G = G + ColOut(1, X, Iy) + ColOut(1, Ix, Y)
B = ColOut(2, Ix, Iy)
B = B + ColOut(2, X, Iy) + ColOut(2, Ix, Y)
R = R * Div2
G = G * Div2
B = B * Div2
RR = RR + R
GG = GG + G
BB = BB + B
If RR < 0 Then RR = 0
If RR > Max Then RR = Max
If GG < 0 Then GG = 0
If GG > Max Then GG = Max
If BB < 0 Then BB = 0
If BB > Max Then BB = Max
ColOut(0, X, Y) = RR
ColOut(1, X, Y) = GG
ColOut(2, X, Y) = BB
Next
Next
Done = True
TimeFilter = timeGetTime - TimeFilter
Exit Sub
ErrLine:
Done = True
MsgBox Err.Description
End Sub
因為在計算新的像素的過程中會出現新的值大於255或小於0的情況,因此必須在計算完成後判斷。
所用到的全局變量:
Public TimeFilter As Long '用於記錄濾鏡處理所花費的時間
Dim RR As Long '用於保存紅色份量
Dim GG As Long '用於保存綠色份量
Dim BB As Long '用於保存藍色份量
二,柔化
柔化的算法和銳化相近似,不過作用正好相反,就是把當前點用周圍幾個點的平均值來代替。
A B C D
E F G H
I J K L
M N O P
計算方法:
F=(A+B+C+E+F+G+I+J+K) / 9
G=(B+C+D+F+G+H+J+K+L) / 9
...
...
具體的程序,我這裡就不囉嗦了,大家只要把上面的程序小小改動一下就可以了。
三,擴散,產生一種類似水彩畫的效果。
算法很簡單,就是將當前點用周圍的隨即的點來代替。
A B C D
E F G H
I J K L
M N O P
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 C D
E F G H
I J K L
M N O P
如果我們按照從左向右的方向來「雕刻」
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(Optional EmbossDirection As Integer , Optional Lighteness As Integer)
...