如果要計算梯度圖,就必須設計模板卷積。第壹,計算時壹定要了解圖像的坐標系。許多博客文章對應的模板與坐標系不匹配。我們在卷積運算中主要使用計算坐標系。
左邊攝像師使用的坐標系經常用於圖像計算。它的坐標原點在左上角,X軸水平向右延伸。y是垂直的,向下延伸。它不僅可以表示這個圖像,還可以表示坐標上像素的值。
屏幕顯示經常使用右邊的Lena坐標系,因為屏幕掃描是從左到右,從上到下進行的。原點在圖像的左上角,縱軸標記圖像的行,橫軸標記圖像的列。它不僅可以表示這個圖像,還可以表示行和列的交點處的圖像值。
我們首先需要知道的是,梯度是壹個向量。如果它是壹個向量,它就有方向和大小。梯度方向指向函數變化最快的方向,大小就是它的模和最大變化率。對於二元函數,它在該點的梯度是,或者,它是:
其中,該梯度向量的振幅和方向角為
下圖顯示了灰度貼圖的數學表達式。壹個像素的灰度值是它有八個鄰域。
圖像在該點的梯度為
在…之中
即圖像對應的水平方向,即水圖像對應的垂直方向。
要了解漸變圖的生成,首先要了解模板卷積的過程。
模板卷積是模板操作的壹種方式,其步驟如下:
(1)在輸入圖像中漫遊模板,並將模板的中心與圖像中的像素位置重疊;
(2)將模板上的每個系數與模板下每個對應像素的灰度相乘;
(3)將所有乘積相加(為了保持灰度範圍,往往將結果除以模板系數之和,如果梯度算子的模板和為0則不必除法);
(4)將上述運算結果(模板的響應輸出)賦給輸出圖像中模板中心位置對應的像素。
其實梯度圖的生成和模板卷積是壹樣的,只是不同的是,生成梯度圖需要計算模板卷積完成後該點梯度的幅度,以該幅度作為像素值,從而完成計算。。
下圖顯示了用於生成漸變圖的水平模板和垂直模板:
例如,如果只想生成水平方向的漸變圖,那麽只計算水平方向的漸變,漸變圖上對應點的灰度值為
壹般水平方向用壹個模板,垂直方向用壹個模板,然後合並,那麽該點的漸變圖灰度值為
就是我們上面說的梯度的幅度,以2為範數計算,對應的是歐氏距離。因為涉及平方和和平方根運算,所以計算量比較大。如何簡化計算?改成近似的計算方法!!!)
在計算實際坡度圖輸出時,采用了壹種簡單的計算方法,定額為1(對應於市區距離),即
另壹個簡單的方法是取為規範(對應於棋盤距離),即
首先了解下梯度算子的設計,壹般是橫平豎直。水平模板轉置後對折,就是垂直方向。
其本質是壹個對角梯度算子,對應的水平和垂直梯度為
輸出漸變圖的灰度值為
優點:邊緣定位準確
缺點:(1)沒有描述水平和垂直方向的灰度變化,只關註對角線方向,容易造成遺漏。(2)魯棒性差。由於點本身參與梯度計算,不能有效地抑制噪聲幹擾。
適用於邊緣明顯、噪點較少的圖像。
Prewitt算子是典型的模板,其模板中心對應需要梯度的原始圖像坐標,對應的8鄰域像素灰度值如下表所示:
通過Prewitt算子的水平模板卷積後,對應的水平梯度為
通過Prewitt算子的垂直模板進行卷積後,對應的垂直梯度為
輸出漸變圖的灰度值為
Prewitt算子引入了類似於局部平均的運算,對噪聲有平滑作用,比Roberts算子更能抑制噪聲。
通過Prewitt算子的水平模板卷積後,對應的水平梯度為
通過Prewitt算子的垂直模板進行卷積後,對應的垂直梯度為
輸出漸變圖的灰度值為
Sobel算子引入了類似於局部加權平均的運算,其邊緣定位比優於Prewitt算子。
Python調用OpenCV接口實現Sobel算子邊緣檢測。