上一次,我們講了銳化、柔化、擴散、雕刻這幾個濾鏡的算法和實現
請參考《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 》
(這里只是說了我自己在寫程序的時候用到的方法,存在很多的不足。并且因為在貼上來的時候作了部分修改,可能會存在部分錯誤,請各位高手不吝賜教,將您用到的更好的方法提供一下,我將不勝感激。)