0基礎自學數字圖像處理中的邊緣檢測,用了幾天時間,大部分用在了學數學上。要想完成邊緣檢測,在程序上用不了多少代碼,而恰恰是這簡單代碼的背後,存在着存在着諸多數學原理。爲此我重學了一部分數學,在這段時間裏,對數學的態度也發生了改變,由過去的覺得它枯燥,抽象,無法理解,到現在的覺得數學精巧,甚至有點習喜歡上數學。
下面就把我這幾點學習的過程描述一下:
邊緣檢測中存在的一個重要概念是梯度。
強烈推薦一個外文網站,
http://mathinsight.org/directional_derivative_gradient_introduction
給這個網站五星好評,裏面對很多數學知識講解的那是相當透徹,裏面有三維動畫。相比之下。。。行,我就不吐槽中國的高數教材了。
簡單的說,在有一個變量的函數中,曲線某點的斜率就等於梯度。
在有兩個或兩個以上變量的函數中,如z = f(x,y),由xy軸組成了一個平面,裏面存在n個方向,其中x和y方向是特例,對x和y方向求導,稱爲偏導數,偏導數又是方向導數的特例,我們可以對處x和y方向的任意方向求導,這就是方向導數的概念,在方向導數中也存在斜率,但隨着曲面上某點方向不同,斜率也不同。但在某一方向,存在一個導數最大值,其值就是梯度。
這是我看了上面那個網站的講解後,說出的我對梯度的理解,寫得比較粗糙,還是建議看上面那個網站。
偏導數,方向導數,梯度是邊緣檢測所需要的數學基礎。
通俗的講,梯度就是變化率,在圖像中,則是某點周圍的像素灰度變化程度,而邊緣檢測研究的就是這個,當一個點周圍臨近點的像素差別很大,從人眼來看,這就是一個邊緣。
由於計算機求導計算量大,因此用一階差分代替一階偏導
梯度值等於某點在水平方向和數值方向偏導數的平方,如此計算量比較大,因此用xy方向的偏導和代替梯度值。
由於計算梯度的方法是近似得出的,因此就由不同人提出了很多近似算法,來代替梯度,計算梯度的加減乘除又可以寫成矩陣形式,人們把這些矩陣稱爲算子。
如 Roberts算子,Prewitt算子,Sobel算子等。
至此我終於明白了這些奇怪算子的由來。
這是這幾天學習的成果。
而至於如何程序實現或其他細節,網上例子很多。