免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

VB圖像處理,(四)幾個常用濾鏡的實現2

http://big5.webasp.net/article/16/15937.htm
上一次,我們講了銳化、柔化、擴散、雕刻這幾個濾鏡的算法和實現
請參考《VB圖像處理,(三)幾個常用濾鏡的實現1 》


在這一篇中我將和大家講述鉛筆畫算法和木雕算法和它們的實現。
為什麼我要把這兩個算法放在一起說呢,因為這兩個算法是非常相似的。
首先要說一下人的眼睛對於圖像的觀察,人的眼睛對於灰度(亮度)的敏感
要遠遠大於對色彩的敏感,而人的眼睛對於暖色調和冷色調的敏感有要遠大於
對一般色彩的敏感度。
經過大量的測試,人們得到了一個經驗公式,來說明人的眼睛是如何識別亮度的:
Gray = Red * 0.3 + Green * 0.6 + Blue * 0.1
而右因為人的眼睛對於綠色的敏感度最大,就有了一個更加近似的公式:
Gray = Green
請大家再回想一下以前在用鉛筆畫眼睛看到的景色的時候,是如何做的呢?
輪廓,對了,輪廓是什麼呢?其實說白了就是灰度的一個跳變。
因此我們只要設定一個閥值,把電腦上的圖片中的像素的色彩轉化為灰度,再把
相鄰的兩個像素的灰度去比較,當灰度變化超過一定的量的時候,我們就判斷它是輪廓。
用鉛筆把它描繪出來。
有了這個思路,我們就很容易把這個算法寫出來了。
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 '當前點的灰度哦。
ColNext = ColOut(0, M, N) * 3 + ColOut(1, M, N) * 6 + ColOut(2, M, N)
ColNext = -ColNext / 10 '下一點的灰度哦。
If Col + ColNext > Sensitivity Then '判斷灰度變化是否超過設定的閥值
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
這裡用到的所有全局變量都已經在前幾章中用到,就不再重複說明了。

說到這裡,那麼木雕的原理就更簡單啦,無非就是判斷該點像素的灰度,如果灰度大於給定的閥值,
就設它為白色,如果該點像素的灰度小於給定的閥值,就設定它為黑色。
那麼,這個算法,我就不寫出來了,讓給電腦前的讀者,自己寫一個試試看吧,不會難道你的。
這兩篇講的都是一些很簡單的圖像處理,下一篇講給大家講「灰度直方圖」的概念,大家或許用過
PhotoShop中的AutoLevel的功能吧,它可以把一張色彩很「彆扭」的圖像轉換為很「舒服」的效果,
那麼就需要用到「灰度直方圖」這個工具了,希望大家不要錯過。


對了,前幾章的內容請點一下鏈接:
《VB圖像處理,(一)像素的獲取和輸出 》
《VB圖像處理,(二)二次線性插值的應用》
《VB圖像處理,(三)幾個常用濾鏡的實現1 》


(這裡只是說了我自己在寫程序的時候用到的方法,存在很多的不足。並且因為在貼上來的時候作了部分修改,可能會存在部分錯誤,請各位高手不吝賜教,將您用到的更好的方法提供一下,我將不勝感激。)
返回列表