l 進階效果之描邊效果
相對浮雕效果來說,描邊(邊緣檢測)的代碼并不復雜多少,只是在理論上相對來說稍微復雜一點,而且效果看上去更加的討人喜歡一些。
如果在圖像的邊緣處,灰度值肯定經過一個跳躍,我們可以計算出這個跳躍,并對這個值進行一些處理,來得到邊緣濃黑的描邊效果。
首先考慮對這個象素的左右兩個象素進行差值,得到一個差量,這個差量越大,表示圖像越處于邊緣,而且這個邊緣應該左右方向的。同樣我們能得到上下方向和兩個對角線上的圖像邊緣。這樣我們需要構造一個濾波器

經過這個濾波器后得到的是圖像在這個象素處的變化差值,把它轉化成灰度值并求絕對值(差值可能為負),然后我們定義差值的絕對值越大的地方越黑(邊緣顯然是黑的),否則越白,可以得到如下的效果:

該效果的代碼如下(其中dip_filter函數代碼同上):

上面演示的效果種用到的模板就是一種邊緣檢測器,在信號處理上是一種基于梯度的濾波器,又稱邊緣算子。梯度是有方向的,和邊沿的方向總是正交(垂直)的,在上面的代碼中,我們采用的就是一個梯度為45度方向模板,它可以檢測出135度方向的邊沿。
以上是簡單的邊緣檢測算子。更加嚴格的,我們可以采樣Sobel算子。Sobel 算子有兩個,一個是檢測水平邊沿的
,另一個是檢測垂直平邊沿的
同樣,Sobel算子另一種形式是各向同性Sobel算子,也有兩個,一個是檢測水平邊沿的
,另一個是檢測垂直邊沿的
。各向同性Sobel算子和普通Sobel算子相比,它的位置加權系數更為準確,在檢測不同方向的邊沿時梯度的幅度一致。讀者可以自行嘗試Sobel算子的效果,只要修改pencil_filter的值就可以了。
posted on 2007-11-13 01:58
七星重劍 閱讀(974)
評論(0) 編輯 收藏 引用 所屬分類:
Game Graphics 、
HLSL&ShaderMonkey