在這一篇中我將和大家講述鉛筆畫算法和木雕算法和它們的實(shí)現(xiàn)。為什么我要把這兩個(gè)算法放在一起說呢,因?yàn)檫@兩個(gè)算法是非常相似的。首先要說一下人的眼睛對(duì)于圖像的觀察,人的眼睛對(duì)于灰度(亮度)的敏感要遠(yuǎn)遠(yuǎn)大于對(duì)色彩的敏感,而人的眼睛對(duì)于暖色調(diào)和冷色調(diào)的敏感有要遠(yuǎn)大于對(duì)一般色彩的敏感度。
經(jīng)過大量的測(cè)試,人們得到了一個(gè)經(jīng)驗(yàn)公式,來說明人的眼睛是如何識(shí)別亮度的:
Gray = Red * 0.3 + Green * 0.6 + Blue * 0.1
而右因?yàn)槿说难劬?duì)于綠色的敏感度,就有了一個(gè)更加近似的公式:
Gray = Green
請(qǐng)大家再回想一下以前在用鉛筆畫眼睛看到的景色的時(shí)候,是如何做的呢?輪廓,對(duì)了,輪廓是什么呢?其實(shí)說白了就是灰度的一個(gè)跳變。因此我們只要設(shè)定一個(gè)閥值,把電腦上的圖片中的像素的色彩轉(zhuǎn)化為灰度,再把相鄰的兩個(gè)像素的灰度去比較,當(dāng)灰度變化超過一定的量的時(shí)候,我們就判斷它是輪廓。用鉛筆把它描繪出來。
有了這個(gè)思路,我們就很容易把這個(gè)算法寫出來了。
Public Sub Pencil(Optional ByVal Sensitivity As Long = 25)
Dim I As Long
Dim L As Long
Dim M As Long
Dim N As Long
Dim Col As Long
Dim ColNext As Long
'On Error GoTo ErrLine
If Not CanPut Then Exit Sub
Done = False
TimeFilter = timeGetTime
For I = 0 To OutPutWid - 1
M = I + 1
For L = 0 To OutPutHei - 1
N = L + 1
Col = ColOut(0, I, L) * 3 + ColOut(1, I, L) * 6 + ColOut(2, I, L)
Col = Col \ 10 '當(dāng)前點(diǎn)的灰度哦。
ColNext = ColOut(0, M, N) * 3 + ColOut(1, M, N) * 6 + ColOut(2, M, N)
ColNext = -ColNext / 10 '下一點(diǎn)的灰度哦。
If Col + ColNext > Sensitivity Then '判斷灰度變化是否超過設(shè)定的閥值
ColOut(0, I, L) = 0 'RGB(0,0,0)表示黑色
ColOut(1, I, L) = 0
ColOut(2, I, L) = 0
Else
ColOut(0, I, L) = 255 'RGB(255,255,255)表示白色
ColOut(1, I, L) = 255
ColOut(2, I, L) = 255
End If
Next
Next
Done = True
TimeFilter = timeGetTime - TimeFilter
Exit Sub
ErrLine:
MsgBox Err.Description
End Sub
經(jīng)過大量的測(cè)試,人們得到了一個(gè)經(jīng)驗(yàn)公式,來說明人的眼睛是如何識(shí)別亮度的:
Gray = Red * 0.3 + Green * 0.6 + Blue * 0.1
而右因?yàn)槿说难劬?duì)于綠色的敏感度,就有了一個(gè)更加近似的公式:
Gray = Green
請(qǐng)大家再回想一下以前在用鉛筆畫眼睛看到的景色的時(shí)候,是如何做的呢?輪廓,對(duì)了,輪廓是什么呢?其實(shí)說白了就是灰度的一個(gè)跳變。因此我們只要設(shè)定一個(gè)閥值,把電腦上的圖片中的像素的色彩轉(zhuǎn)化為灰度,再把相鄰的兩個(gè)像素的灰度去比較,當(dāng)灰度變化超過一定的量的時(shí)候,我們就判斷它是輪廓。用鉛筆把它描繪出來。
有了這個(gè)思路,我們就很容易把這個(gè)算法寫出來了。
Public Sub Pencil(Optional ByVal Sensitivity As Long = 25)
Dim I As Long
Dim L As Long
Dim M As Long
Dim N As Long
Dim Col As Long
Dim ColNext As Long
'On Error GoTo ErrLine
If Not CanPut Then Exit Sub
Done = False
TimeFilter = timeGetTime
For I = 0 To OutPutWid - 1
M = I + 1
For L = 0 To OutPutHei - 1
N = L + 1
Col = ColOut(0, I, L) * 3 + ColOut(1, I, L) * 6 + ColOut(2, I, L)
Col = Col \ 10 '當(dāng)前點(diǎn)的灰度哦。
ColNext = ColOut(0, M, N) * 3 + ColOut(1, M, N) * 6 + ColOut(2, M, N)
ColNext = -ColNext / 10 '下一點(diǎn)的灰度哦。
If Col + ColNext > Sensitivity Then '判斷灰度變化是否超過設(shè)定的閥值
ColOut(0, I, L) = 0 'RGB(0,0,0)表示黑色
ColOut(1, I, L) = 0
ColOut(2, I, L) = 0
Else
ColOut(0, I, L) = 255 'RGB(255,255,255)表示白色
ColOut(1, I, L) = 255
ColOut(2, I, L) = 255
End If
Next
Next
Done = True
TimeFilter = timeGetTime - TimeFilter
Exit Sub
ErrLine:
MsgBox Err.Description
End Sub

