1.cv2.Sobel(src, ddepth, dx, dy, ksize) 進行sobel算子計算spa
參數說明:src表示當前圖片,ddepth表示圖片深度,這裏使用cv2.CV_64F使得結果能夠是負值, dx表示x軸方向,dy表示y軸方向, ksize表示移動方框的大小3d
2.cv2.convertScalerAbs(src) 將像素點進行絕對值計算code
參數說明: src表示當前圖片blog
sobel算子:分爲x軸方向和y軸方向上的,x軸方向上的算子如圖中的Gx,將sober算子在圖中進行平移,當前位置的像素值等於sobel算子與(當前位置與周邊位置8個點)進行對應位置相乘並相加操做,做爲當前位置的像素點,y軸方向的算子如Gy, 對於x軸方向上,即左右兩邊的比較,圖片
計算方程爲:x軸: p3 - p1 + 2 * p6 - 2 * p4 + p9 - p7, 右邊的像素值減去左邊的像素值it
代碼:class
第一步:載入原始圖片import
第二步:使用cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3) 對x軸方向進行sobel算子相乘操做numpy
第三步:因爲會出現負值的狀況,所以使用cv2.convertScalerAbs() 轉換爲絕對值的形式im
第四步:計算y軸方向上的sobel算子
第五步:使用cv2.addWeighted 將x軸方向的sobel算子的結果和y軸方向上的sobel算子的結果結合
第六步:使用cv2.Sobel(src, cv2.CV_64F, 1, 1, ksize=3) 直接得到x軸和y軸方向上的sobel算子結合
第七步:對這兩個步驟得到的sobel算子做圖
import cv2 import numpy as np # 第一步:加載圖片 img = cv2.imread('pie.png') cv2.imshow('original', img) cv2.waitKey(0) cv2.destroyAllWindows()
# 第二步:對x軸方向上進行sobel算子相乘操做 x_sobel = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) cv2.imshow('x_sobel', x_sobel) cv2.waitKey(0) cv2.destroyAllWindows()
畫圖時的負值,使用0來進行表示,所以右側是黑色的
# 第三步:由於右側像素減去左邊像素,存在負值的狀況,所以使用cv2.convertScaleAbs取絕對值操做 x_sobel = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) x_sobel = cv2.convertScaleAbs(x_sobel) cv2.imshow('x_sobel', x_sobel) cv2.waitKey(0) cv2.destroyAllWindows()
# 第四步:計算y軸的sobel算子 y_sobel = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) y_sobel = cv2.convertScaleAbs(y_sobel) cv2.imshow('y_sobel', y_sobel) cv2.waitKey(0) cv2.destroyAllWindows()
# 第五步:並使用cv2.addweighted進行合併 xy_sobel = cv2.addWeighted(x_sobel, 0.5, y_sobel, 0.5, 0) # 第六步: 直接使用cv2.sobel 進行計算 xy_sobel_direct = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3) # 第七步:畫圖比較分步合併和一步到位的結果差別 cv2.imshow('imgs', np.hstack((xy_sobel, xy_sobel_direct))) cv2.waitKey(0) cv2.destroyAllWindows()
從圖中咱們能夠看出x和y軸各自求,再作合併比直接求得的結果,輪廓更加的明顯