天天看點

OpenCV-Python圖像梯度 Sobel算子

圖像的梯度計算的是圖像變化的速度,對于邊緣部分呢灰階值變換大,梯度值也大,相反則灰階值變化小,梯度值小

Sobel算子是一種離散的微分算子,該算子結合了高斯平滑處理和微分求導運算。 該算子利用局部差尋找邊緣

OpenCV-Python圖像梯度 Sobel算子

将Sobel算子Gx和原始圖像卷積可以得到水準方向的像素值變化,與Gy卷積的到垂直方向的像素值變化。

OpenCV-Python圖像梯度 Sobel算子

将sober算子在圖中進行平移,目前位置的像素值等于sobel算子與(目前位置與周邊位置8個點)進行對應位置相乘并相加操作,作為目前位置的像素點。

如果要計算P5的水準方向,則需要Sobel算子及P5鄰域點

公式為:P5x軸 = P3 - P1 + 2 * P6 - 2* P4 + P9 - P7

用P5右側的像素點減左側的像素點,因為P4和P6離P5較近,是以權值為2,其他為1垂直方向類似,垂直是下減上。

import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

def Sobel():
    img = cv2.imread('images/pie.png', cv2.IMREAD_GRAYSCALE)
    cv2.imshow("img", img)
    
    # 使用cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3)  對x軸方向進行sobel算子相乘操作
    sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
    # 由于會出現負值的情況,是以使用cv2.convertScalerAbs() 轉換為絕對值的形式
    sobelx = cv2.convertScaleAbs(sobelx)
    cv_show(sobelx, 'sobelx')
    
	# 計算y軸方向上的sobel算子
    sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
    sobely = cv2.convertScaleAbs(sobely)
	cv_show(sobely, 'sobely')
	 
	# 使用cv2.addWeighted 将x軸方向的sobel算子的結果和y軸方向上的sobel算子的結果結合
    sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
    cv_show(sobelxy, 'sobelxy')

    
           
OpenCV-Python圖像梯度 Sobel算子