1. 程式人生 > 實用技巧 >05 梯度處理

05 梯度處理

梯度

梯度計算是:在某個通道內,計算某個畫素點和周圍(水平,垂直,四周...)的畫素的亮度差異的大小,不同的運算元代表不同的計算方式

運算元

Sobel運算元 一種常用的運算元

\[Gx = \begin{bmatrix} {{-1}}&{{0}}&{{1}}\\ {{-2}}&{{0}}&{{2}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

\[Gy = \begin{bmatrix} {{-1}}&{{-2}}&{{-1}}\\ {{0}}&{{0}}&{{0}}\\ {{1}}&{{2}}&{{1}}\\ \end{bmatrix}\]

\[Gxy = \begin{bmatrix} {{1}}&{{0}}&{{-1}}\\ {{0}}&{{0}}&{{0}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

邊緣點

\[G =2 \begin{bmatrix} {{-1}}&{{0}}&{{1}}\\ {{-1}}&{{0}}&{{1}}\\ \end{bmatrix}\]

\[G =2 \begin{bmatrix} {{-1}}&{{-1}}\\ {{0}}&{{0}}\\ {{1}}&{{1}}\\ \end{bmatrix}\]

Sobel運算元一般取3X3矩陣(可以自由指定),它會用它的中心遍歷每個通道的影象中的每個畫素點,並進行運算(對應位置相乘,並相加),得到的結果作為該畫素點的亮度值

對於Gx右邊的值 減去 左邊的值.
權重: 在水平方向,靠近中心點(目標畫素點)的權重為2,大於斜向值1

對於Gy下邊的值 減去 上邊的值.
權重: 在垂直方向,靠近中心點(目標畫素點)的權重為2,大於斜向值1


img= cv2.imread('imgs/300.png',0)
cv2.imshow('1',img)
img2 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.CV_64F:
1,0:x 方向
0,1:y 方向
ksize:核大小

Scharr運算元

\[Gx = \begin{bmatrix} {{-3}}&{{0}}&{{3}}\\ {{10}}&{{0}}&{{10}}\\ {{-3}}&{{0}}&{{3}}\\ \end{bmatrix}\]

\[Gy = \begin{bmatrix} {{-3}}&{{-10}}&{{-3}}\\ {{0}}&{{0}}&{{0}}\\ {{3}}&{{10}}&{{3}}\\ \end{bmatrix}\]

原理上:和Sobel運算元沒有區別,差異在於比例放大了,也就是說,同樣的差異,Scharr運算元認為差異更大---更加敏感,放大細節

Laplacian運算元

\[G = \begin{bmatrix} {{0}}&{{1}}&{{0}}\\ {{1}}&{{-4}}&{{1}}\\ {{0}}&{{1}}&{{0}}\\ \end{bmatrix}\]

通過結構可知:Laplaceian運算元強調畫素點和它上下左右四個畫素點自和進行比較,有什麼應用場景呢?還不知道

具體演算法

(x,y單方向)
1.非邊緣畫素:對應位置,數值權重 再求和
2.邊緣點
2.1 x方向:第一豎一定是0,設為基礎點。其餘邊緣點 = 2
(右-左)
2.2 y方向:第一行一定是0,設為基礎點。其餘邊緣點 = 2*(下-上)
(x,y斜向):(左上+右下)-(右上+左下)